我有两个模型,一个例子:
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 :(得分:0)
我花了几次尝试才看到你在谈论什么。但我现在明白了。
看一下SQL,你会发现ActiveRecord正在做一个选择,然后添加ASC
和LIMIT 1
。 可以是多个引用相同answer_sheet的报告记录。
您可以通过添加检查answer_sheet_id唯一性的验证来防止出现这种情况。
您还应该开始使用保存!并创造! (注意爆炸操作符)因此在验证期间会抛出异常。
最后,调用Report.create后跟@ answersheet.save执行两个数据库事务,而Report.new后跟@ answersheet.save只执行一个。