2016-08-19 40 views
0

我试图在rails中更新单个窗体上的多个记录。Rails,使用集合模型一次更新多个记录在一个表单上

我看过railscast #165,但我试图用更简洁的方式做到这一点。

有没有办法创建另一个模型,一种集合模型,并使用accept_nested_attributes一次更新多个记录?

例如,将会有一个正常的ProductModel,然后是一个ProductCollections模型。 ProductCollections模型会拥有多个产品,并且它还会为产品提供accept_nested_attributes_。

我遇到了问题,因为我试图做到这一点,而不是在数据库中为ProductCollections模型创建表。我也想知道路由应该如何工作。

+1

'Product.update()'将采用几个ID和属性数组。因此,您可以设置一个PATCH方法来接收许多产品并一次编辑多个产品。或者您可以按照您的说法进行操作并创建一个product_collection。有没有其他的对象自然是一个product_collection,就像'商店'或'部门'或什么的? – Swards

+0

是的,已经有一位家长(商店)。我不确定为什么我没那么早想到。我可以用它自己的嵌套窗体创建一个ProductCollectionController ...但仍然只是使用正常的产品模型。感谢您的帮助。 – tquill

+0

在这种情况下,您实际上会编辑(和更新)商店对象。产品的accepted_nested_attributes_将存储在商店中,然后您只需提交更新操作即可。这将全部在stores_controller上。 – Swards

回答

0

根据Sward's评论,不需要新模型。由于每个产品都有一个父级(商店),因此我可以使用Store型号和accepts_nested_attributes_for :products

我刚刚为产品(处理传入表单提交和重定向)以及带有fields_for表单的视图同时更新多个记录创建了一个单独的集合控制器。

0

有一种简单的方法: (以下从railscast的例子中,使用Rails的较新版本)

Product.where(id: params[:product_ids]).update_all(discontinued: true) 

它比以前的版本的API更具有可读性。您首先使用典型的搜索API选择产品,然后将update_all应用于该查询的结果。

ProductCollection是带有ProductModel类的给定查询的结果。它不需要自己的数据库表。

+0

我想保持我的问题有点简单,但实际上,我的产品在它们下面嵌套了另一个模型。是否有可能使用你的方法更新这些?我正在考虑accept_nested_attributes_for方法,因为很容易进行多层嵌套。 – tquill

+0

我相信你可以做到这一点。在这些参数中应该是嵌套值。例如,如果接受:item的嵌套属性,那么在更改参数中,应该有item_attributes:{updated_at:Time.now} –

相关问题