Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails rails-如何在保存后刷新关联_Ruby On Rails_Ruby On Rails 3_Activerecord - Fatal编程技术网

Ruby on rails rails-如何在保存后刷新关联

Ruby on rails rails-如何在保存后刷新关联,ruby-on-rails,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby On Rails 3,Activerecord,我有一个类别和项目列表。项目有一个位置,类别有一个关系,有许多:项目,:顺序=>“位置”。当用户更新位置值时,我想查看其位置。我的位置是一个浮动,允许在四舍五入的数字之间移动 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(&:

我有一个类别和项目列表。项目有一个位置,类别有一个关系,有许多:项目,:顺序=>“位置”。当用户更新位置值时,我想查看其位置。我的位置是一个浮动,允许在四舍五入的数字之间移动

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

上面的工作,但它似乎真的冗长。是否有一种方法可以让我在项目保存时告知需要刷新类别关系,因为订单可以更改?

您可以使用
项目。重新加载将从数据库中重新提取模型的
,下次调用关联时,当关联对象发生更改时,Rails 4将为您更新has MONY/BETHING到关联对象,但不会重新运行查询,这意味着即使将更新category.items中的项,它们也不会按顺序排列。根据表的大小,您可能希望使用ruby对结果进行排序,或者使用category.reload对结果进行排序


请参阅中的铁路指南,并查找单个项目关联的反向值:

book.reload_author
author.books.reload
其他协会:

book.reload_author
author.books.reload



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

谁仍然通过搜索得到这个答案(就像我刚才做的那样):rails不再支持这种行为。您将收到一个弃用警告。收集的新方法是在收集代理上使用
reload
方法。@klaustopher谢谢。更新了我的答案。“弃用警告:传递参数以强制重新加载关联现在已弃用,并将在Rails 5.1中删除。请改为在父对象上调用
reload
。(从at(pry):2调用)“我们为什么要手动调用此重新加载?”?难道没有自动完成的方法吗?thanks@newBike您可以手动调用它,因为您而不是Rails知道何时需要它。您可能会在内存中设置模型的值,并在以后保存,但重新加载会使您的更改受到冲击并将其设置回原位。另外,当您更新值并保存时,您已经在内存中的对象中拥有了更新的数据,因为您只是在数据库拥有该值之前设置了它。