是否在has_one关系中添加新对象,而不是更新关联?

时间:2013-08-31 06:30:26

标签: ruby ruby-on-rails-3

我有两个模型,一个例子:

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.

这应该是正确的行为吗?

如果我想更新后续报告的关联,我应该怎么做呢?

1 个答案:

答案 0 :(得分:0)

我花了几次尝试才看到你在谈论什么。但我现在明白了。

看一下SQL,你会发现ActiveRecord正在做一个选择,然后添加ASCLIMIT 1可以是多个引用相同answer_sheet的报告记录。

您可以通过添加检查answer_sheet_id唯一性的验证来防止出现这种情况。

您还应该开始使用保存!并创造! (注意爆炸操作符)因此在验证期间会抛出异常。

最后,调用Report.create后跟@ answersheet.save执行两个数据库事务,而Report.new后跟@ answersheet.save只执行一个。