【问题标题】:Rails - how to use reload method?Rails - 如何使用重新加载方法?
【发布时间】:2012-12-12 06:28:32
【问题描述】:

案例1:为模型创建新记录并分配关联对象(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' 值而不是 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之前还是之后?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    示例 1 如果save 有效,那么reload 将不会做任何事情,visit.status_id 的值将是Status.last.id。但是,如果 save 失败,则 visit.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 确实有效。

    希望对你有帮助。

    【讨论】:

    • 感谢您的回答,根据您的示例 1,当我在控制台中保存记录时,它返回 true,并且对象没有任何错误(表有新记录),现在我'正在更新值(不重新加载记录)它没有更新,如果更新应该完成,我必须重新加载然后编辑值然后用新值更新记录
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多