9

Po przejściu z szyn 3,2 do 4,1, następujące kod, który stosuje się do pracy jest obecnie braku:Po przejściu do szyn 4.1 nowe związki polimorficzne są nieważne, gdy zapisywanie ich wraz z rodzica

w sterowniku/ciemno:

post = user.posts.build 
post.contacts << contact # contact is a persisted record 
post.save! # now fails 

jestem zasadniczo próbuje zapisać stanowisko wraz ze związanym z nim kontaktu, który ma stworzyć contact_publishment zapis on-the-fly. Błąd znajduje się na nowym contact_publishment rekordu: „Publikowanie nie może być puste”

model:

class Contact 
    ... 
    has_many :contact_publishments 
    ... 
end 

class ContactPublishment 
    ... 
    belongs_to :publishable, polymorphic: true 
    belongs_to :contact 
    validates_uniqueness_of :publishable_id, :scope => [:contact_id, :publishable_type] 
    validates_presence_of :contact, :publishable 
    ... 
end 

class Post 
    ... 
    has_many :contact_publishments, as: :publishable 
    has_many :contacts, through: :contact_publishments 
    ... 
end 
+0

Otrzymasz Błąd na '' lub zapisać na '' << linii! – nathanvda

+0

w 'zapisz!'. –

+0

Pomocne byłoby sprawdzenie poprawności – Benj

Odpowiedz

9

w szynach modelu 3,2 właściciel wcześniej zapisane sprawdzania poprawności zagnieżdżone związek w 4,1 sprawdzania przed modelu zapisane, a ponieważ po nie został zapisany, walidacja

class ContactPublishment 
    validates_presence_of :publishable 

nie przepuszczane zatwierdzenia (post nie zapisane w db)

Aby rozwiązać ten problem, można wyłączyć sprawdzanie poprawności w modelu post (walidacja na ContactPublishment został nazwany od kontaktu modelu)

class Post < ActiveRecord::Base 
     has_many :contact_publishments, as: :publishable, validate: false 

lub wymienić walidacja obecność tak:

class ContactPublishment < ActiveRecord::Base 
    validates_associated :publishable 

change_column :contact_publishments, :publishable_type, :string, null: false 
change_column :contact_publishments, :publishable_id, :integer, null: false 

czy to przez proxy_association

+0

Dziękuję! zadziałało! z wyjątkiem poleceń 'change_table', które musiałem zmienić na' change_column'. Wielkie dzięki, utknąłem na tym przez kilka dni. –

+0

Oczywiście, byłaby poprawna kolumna zmiany, kiedy napisał, myślał o ALTER TABLE. Dziękuję Ci! – Vakiliy

+0

Wow, to jest naprawdę dziwne dla nich zmienić się w Railsach ...: P –

1

myślę, że stowarzyszenie nie jest aktualizowany, bo nie masz inverse_of konfigurację między kontakcie i contact_publishment.

From the docs about setting up a :through

Jeśli masz zamiar zmodyfikować stowarzyszenie (zamiast tylko czytać z go), to jest to dobry pomysł, aby ustawić: inverse_of opcją sprawie stowarzyszenia źródłowego na modelu przyłączenia . Pozwala to na tworzenie powiązanych rekordów , które automatycznie tworzą odpowiednie zapisy łączenia rekordów po ich zapisaniu.

+1

Wypróbowałem to i nie zadziałało. Niezależnie od tego problem nie dotyczy 'kontaktu', ale z' contact_publishment' i 'post'. Co więcej, 'inverse_of' nie działa z powiązaniami polimorficznymi, więc nie zadziała w przypadku' posta ' –