2013-03-28 80 views
4

以下機型給出:爲什麼ActiveRecord的自動驗證的has_many協會

class Question < ActiveRecord::Base 
    has_many :answers 
end 

class Answers < ActiveRecord::Base 
    belongs_to: question 
    validates :comment, presence: true 
end 

當調用

question = Question.new 
question.answers.build 
question.valid? 

valid?回報false,因爲相關的答案無效。當Questionvalid?回報true

has_many :answers, validate: false 

使用has_many時,它是一個錯誤還是需要關聯的模型自動驗證? Rails的指南明確說明使用的validate_associatedhas_many關係:http://guides.rubyonrails.org/active_record_validations_callbacks.html#validates_associated

+3

爲什麼*不會驗證正在創建的模型? – 2013-03-28 11:12:34

+2

我創建沒有模型我只驗證問題。爲什麼要打電話給question.valid?觸發每個答案的驗證,儘管validate_associated沒有明確設置。 – dan 2013-03-28 11:31:10

回答

5

這是最肯定的錯誤。

  • 你已經創建了一個Question
  • 你告訴Rails的附加的Answer一個新實例,它涉及到這個新Question
  • 然後你問「的Rails,這是Question/Answer模型和我創建的關聯可以保存到數據庫中嗎?「

正如您看到的,Rails會說你的情況「否」

我從來沒有用過也不關心validates_associated。然而,我可以指出你的文件解釋你爲什麼看到你的行爲。

雖然在前面的源文件的文檔是值得一讀在它的全部,我會拔出此位爲你

需要注意的是:自動保存= > false與不聲明:自動保存不同。 當自動保存選項不存在時,新的關聯被保存。

  • 你有沒有在你的:answers協會
  • 正因爲如此規定:autosave => SOMETHING,在默認情況下Rails的是要盡力挽救你的新建/你的新Question
  • 保存操作將相關Answer因爲Answer無效
+0

我不試圖保存quesiton我只打電話有效?因此自動保存不是我想要的。當have_one關聯有效時?不會在關聯的記錄上自動調用。爲什麼have_many在這裏不一樣。我不想依賴一個可能是bug並在下一個版本中修復的行爲。 – dan 2013-03-28 12:20:26

+0

'保存'調用'有效'作爲其過程的一部分。如果您嘗試避免此行爲,請在關聯中設置':autosave => false'。除了告訴你這不是一個錯誤,指向解釋推理和行爲的文檔,並且如果您選擇進行更改,則會朝着「解決」您所遇到的問題的正確方向發展。 – deefour 2013-03-28 12:24:05

+0

autosave_association.rb中的這條評論解釋了行爲_「兒童記錄已經過驗證,除非:驗證是+ false +。」但是它很不奇怪,它不適用於has_one,所以至少有很大的不一致或者可能一個錯誤。感謝您的幫助。 – dan 2013-03-28 12:43:46

0

我在母模式中覆蓋了valid? l爲了處理驗證照顧他們的嵌套協會的狀態:

def valid?(context=nil) 
    super(context) && self.answers.map(&:valid?).all? 
end