2

Case1:为模型创建一条新记录并分配关联对象(Status 对象而不是 Status.id),例如

    visit = Visit.create(:date => Date.today, :status => Status.first)
    visit.status_id #=> 1

创建记录后

我正在尝试更新属性“status_id”(Status.id 而不是 Status 对象),但它返回旧值,甚至在保存对象后调用 reload。例子:

    visit.status_id = Status.last.id
    visit.save
    visit.reload
    visit.status_id #=> 1

当我在创建后调用 reload 方法时,它按预期工作

    visit = Visit.create(:date => Date.today, :status => Status.first)
    visit.status_id #=> 1
    visit.reload
    visit.status_id = 2
    visit.save
    visit.status_id #=> 2

案例 2:如果我分配 'status_id' 值而不是状态对象,则无需重新加载对象并且其工作正常

    visit = Visit.create(:date => Date.today, :status_id => Status.first.id)
    visit.status_id #=> 1
    visit.status_id = 2
    visit.save
    visit.status_id #=> 2

使用上述两种情况,我应该什么时候使用该reload方法?应该在之前还是之后save

4

1 回答 1

5

我认为您对如何savereload工作的理解基本上是正确的。你的结果肯定看起来不一致。根据你的结果,我有一种感觉,你save失败了。

save将尝试将本地版本存储到数据库中。如果模型在您加载后发生更改,它不会刷新数据库中的任何值。如果save失败,本地值仍然是您设置的值,但数据库将具有值。

reload覆盖您所做的任何本地更改并将它们设置为数据库值。

假设您关心的模型的数据库没有争用,让我们来看看您的示例。

示例 1 如果save有效,则将reload不执行任何操作,并且 的值为。但是,如果失败,那么 的值将是数据库中最初的值。visit.status_idStatus.last.idsavevisit.status_id

示例 2 如果create不起作用,那么reload将给出RecordNotFound错误,因为您不能reload保存尚未持久化的内容。之后您将 设置status_id为 2 然后调用save. 无论save成功还是失败,本地的值都status_id将保持为2。但是,数据库值取决于它是通过还是失败。

示例 3 嘿!除了重新加载之外,这与示例 2 相同。

这是一些文档,但我不确定您会发现它有多大帮助:http: //apidock.com/rails/ActiveRecord/Persistence/save

http://apidock.com/rails/ActiveRecord/Persistence/reload

您可能想检查是否save成功或致电save!以确保save实际工作。

我希望这会有所帮助。

于 2012-12-14T20:54:44.203 回答