28

我有一个包含项目列表的类别。项目有一个位置,类别有一个关系 has_many :items, :order => "position"。当用户更新位置值时,我想查看它的位置。我的位置是一个浮点数,允许在四舍五入的数字之间移动。

pos=item.category.items.map(&:id)
current_position=pos.index(id.to_i)
item.save # want to refresh the relationship here
pos_new=item.categoty.items.map(&:id)
# grabbing this since just accessing item isn't updated if positioning has changed
item_new=Item.find(id)
pos_new=item_new.category.items.map(&:id)
new_position=pos_new.index(id)
if current_position!=new_position
  is_moved=true # sent back in JSON to propagate a dynamic change.
end

上面的工作,但它似乎真的很冗长。有没有办法让我告诉项目保存需要刷新类别关系,因为订单可以更改?

4

3 回答 3

63

对于单项关联:

book.reload_author

对于其他协会:

author.books.reload

http://guides.rubyonrails.org/association_basics.html#controlling-caching


在 Rails 5 之前的旧版本 Rails 中,您可以将true关联方法作为第一个参数传递给它以使其重新加载:author.books(true).

于 2014-08-08T21:37:23.530 回答
38

您可以使用item.reload它将从数据库中重新获取模型,并且下次调用关联时,它将重新获取它。

于 2012-10-01T17:55:38.180 回答
6

Rails 4 会在关联对象更改时为您更新 has_many/belongs_to,但它不会重新运行查询,这意味着即使 category.items 中的项目将被更新,它们也不会按顺序排列。根据表的大小,您可能希望使用 ruby​​ 对结果进行排序或使用 category.reload 将它们按顺序排列。

请参阅http://guides.rubyonrails.org/association_basics.html上的 RailsGuides并查找 inverse_of

于 2014-03-06T18:58:03.333 回答