9

從Rails的3.2至4.1升級後,其用於以下工作的代碼現在沒有新的多態關聯無效:升級到Rails 4.1後,與父母一起爲他們節省時

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

基本上,我試圖挽救後與其相關的接觸,這是爲了創建一個contact_publishment紀錄即時一起。 的錯誤是在新contact_publishment記錄:「可發佈不能爲空」

模型:

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

你上了''保存或在''<<線上的錯誤!? 'save!'中的 – nathanvda

+0

。 –

+0

將是有益的看到你的驗證 – Benj

回答

9

在Rails 3.2所有者模型之前已經保存的執行驗證嵌套的關聯,在模型前4.1確認保存,因爲不保存後,驗證

class ContactPublishment 
    validates_presence_of :publishable 

不允許通過驗證(後不保存在DB)

爲了解決這個問題,你可以在Post模型禁用驗證,(上ContactPublishment驗證已經從接觸模型調用)

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

或更換存在驗證這樣的:

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 

或做它通過proxy_association

+0

謝謝你的情況下工作!有效!除了'change_table'命令,我不得不改變'change_column'。非常感謝你,我被困在這幾天。 –

+0

當然,這是正確的change_column,當​​他寫道,思考ALTER TABLE。謝謝! – Vakiliy

+0

哇,這對於他們改變Rails來說是一件很奇怪的事情......:P –

1

我認爲協會沒有更新,因爲你沒有接觸之間inverse_of設置和contact_publishment。

From the docs about setting up a :through

如果你要修改的關聯(而不是僅僅從 讀它),那麼它是設置一個好主意:inverse_of選項上的連接模型的 源協會。這使得相關記錄 要建,它會自動創建相應的連接模型 記錄它們被保存時。

+1

試過了,它沒有工作。無論如何,這個問題是不是與'contact',但與'contact_publishment'和'POST'。此外,'inverse_of'不與多態關聯的工作,所以它不會在'POST' –