ruby-on-rails-3 - Rails - 如何使用重新加载方法?

标签 ruby-on-rails-3 activerecord associations reload

案例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/

相关文章:

ruby-on-rails - Rails 4 - 查找嵌套属性,选择某些子项

ruby-on-rails - 尽管自定义验证无效,Mongoid 仍保存文档

Redis 和关系

ruby-on-rails-3 - Rails 3 - 默认范围

ruby-on-rails - ruby rails 3 : Sign-In With devise and cancan

sql - ActiveRecord:按组计数

ruby-on-rails - Rails 4.1 枚举错误的条件

ruby-on-rails - 如何在 Rails 模型中运行 "do" block ,同时仍列出 :dependent?

ruby-on-rails-3 - 在 Rails 3 查询中使用 count() 和 group(),还是只使用 sql?

ruby-on-rails-3 - gemspec 出了什么问题?