案例1:为模型创建新记录并分配关联对象(Status 对象而不是 Status.id),例如
visit = Visit.create(:date => Date.today, :status => Status.first)
visit.status_id #=> 1
创建记录后
我正在尝试更新属性“status_id”(Status.id 而不是 Status 对象),但即使在保存对象后调用重新加载,它也会返回旧值。示例:
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”值而不是 Status 对象,则无需重新加载对象并且其工作正常
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
将尝试将本地版本存储到数据库中。如果模型自加载后发生更改,它不会刷新数据库中的任何值。如果保存
失败,本地值仍然是您设置的值,但数据库将具有旧值。
reload
覆盖您所做的任何本地更改并将它们设置为数据库值。
假设数据库中不存在您所关心的模型的争用,让我们看一下您的示例。
示例 1
如果保存
有效,那么重新加载
将不会执行任何操作,并且visit.status_id
的值将是Status.last.id
。但是,如果保存
失败,则visit.status_id
的值将是数据库中最初的值。
示例 2
如果 create
不起作用,则 reload
会给出 RecordNotFound
错误,因为您无法reload
没有被坚持下来。之后,将 status_id
设置为 2,然后调用 save
。无论保存
成功还是失败,status_id
的本地值都将保持为2。但是数据库值取决于保存成功还是失败。
示例3 嘿!除了重新加载之外,这与示例 2 相同。
这里有一些文档,但我不确定它对您有多大帮助: http://apidock.com/rails/ActiveRecord/Persistence/save
http://apidock.com/rails/ActiveRecord/Persistence/reload
您可能需要检查save
是否成功或调用save!
以确保save
确实有效。
希望对您有所帮助。
关于ruby-on-rails-3 - Rails - 如何使用重新加载方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13834058/