Rails - 如何使用重载方法?

nis*_*han 1 activerecord associations reload ruby-on-rails-3

案例1:为模型创建新记录,并指定关联对象(Status对象而不是Status.id)

    visit = Visit.create(:date => Date.today, :status => Status.first)
    visit.status_id #=> 1
Run Code Online (Sandbox Code Playgroud)

创建记录后

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

    visit.status_id = Status.last.id
    visit.save
    visit.reload
    visit.status_id #=> 1
Run Code Online (Sandbox Code Playgroud)

当我在创建后调用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
Run Code Online (Sandbox Code Playgroud)

Case2:如果我分配'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
Run Code Online (Sandbox Code Playgroud)

使用上面两种情况,我应该何时使用该reload方法?它应该在之前还是之后save

Geo*_*off 5

我认为你对如何savereload工作的理解基本上是正确的.你的结果肯定似乎不一致.我根据你的结果感觉你save的失败.

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

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

假设您所关注的模型在数据库上没有争用,那么让我们来看看您的示例.

例1 如果save作品,则reload不会做任何事情,价值visit.status_idStatus.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实际工作.

我希望有所帮助.