2013-08-31 44 views
0

我有2個型號,一個例子:是否在has_one關係中添加新對象,而不是更新關聯?

class Report ... 
    belongs_to :answer_sheet 
end 

class AnswerSheet ... 
    has_one :report 
end 

當我做:

@answersheet.report = Report.create(:data => 'bleah') 
@answersheet.save 

# and then create another report and assign it to the same @answersheet 
# assuming at this stage @answersheet is already reloaded 

@answersheet.report = Report.create(:data => 'new data') 
@answersheet.save 


# (irb) @answersheet.report returns the first report with the data 'bleah' and not 
# the one with the new data. 

難道這是正確的行爲?

如果我想更新關聯到後面的報告,我該如何去做呢?

回答

0

我花了幾次嘗試去看看你在說什麼。但我現在明白了。

看看SQL,你會發現ActiveRecord正在做一個選擇,然後加入ASCLIMIT 1。有可以多於一個引用相同answer_sheet的報告記錄。

您可以通過添加驗證來檢查answer_sheet_id的唯一性來防止這種情況。

你也應該開始使用保存!並創造! (注意爆炸操作符),因此在驗證期間拋出異常。

最後,調用Report.create後跟@ answersheet.save執行兩個數據庫事務,而Report.new後跟@ answersices.save只執行一個。

相關問題