0

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

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.

这应该是正确的行为吗?

如果我想将关联更新到以后的报告,我应该怎么做?

4

1 回答 1

0

我试了几次才知道你在说什么。但我现在明白了。

查看 SQL,您会发现 ActiveRecord 正在执行选择,然后添加ASCLIMIT 1可以有多个报告记录引用同一个 answer_sheet。

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

您还应该开始使用保存!并创造!(注意 bang 运算符)因此在验证期间会引发异常。

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

于 2013-08-31T07:21:13.493 回答