2016-08-19 12 views
0

複数のレコードをレールで1つのフォームで更新しようとしています。コレクションモデルを使用して複数のレコードを一度に1つのフォームで更新するレール

私はrailscast #165を見ましたが、私はよりクリーンな方法でそれをやろうとしています。

別のモデル、コレクションモデルの並べ替え、accepts_nested_attributesを使用して一度に複数のレコードを更新する方法はありますか?

たとえば、通常のProductModelがあり、次にProductCollectionsモデルがあります。 ProductCollectionsモデルはhave_many個の製品を持ち、製品に対してaccept_nested_attributes_も使用します。

私はDB内のProductCollectionsモデルのテーブルを作成せずにこれを実行しようとしているので、問題が発生しています。私はまた、ルーティングがどのように機能するのだろうかと思っています。

+1

'Product.update()'はIDと属性の2つの配列をとります。したがって、多くの製品を取り込み、一度に複数を編集するPATCHメソッドを設定することができます。あるいは、product_collectionを作成して作成することもできます。 「store」や「department」などのように、自然にproduct_collectionである他のオブジェクトはありますか? – Swards

+0

はい、既に親(ストア)があります。なぜ私は以前にそれを考えなかったのか分かりません。私はちょうどそれ自身の入れ子になったフォームを持つProductCollectionControllerを作成することができます...しかし、まだ通常の製品モデルを使用しています。お手伝いありがとう。 – tquill

+0

この場合、実際にストアオブジェクトを編集(および更新)します。 accepts_nested_attributes_forプロダクトはストアに格納され、更新アクションにサブミットするだけです。それはすべてstores_controllerにあります。 – Swards

答えて

0

Sward'sコメントに基づいて、新しいモデルは必要ありませんでした。各商品にはすでに親(店舗)があるので、accepts_nested_attributes_for :productsStoreモデルを使用できます。

私は、受信フォームの送信とリダイレクトを処理するための別のコレクションコントローラと、複数のレコードを一度に更新するためのfields_forのフォームを持つビューを作成しました。

0

簡単な方法があります: (Railsの新しいバージョンで、railscastからの例を以下)

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

それはAPIの以前のバージョンよりも読みやすいです。典型的な検索APIを使用して最初に製品を選択し、そのクエリの結果にupdate_allを適用します。

ProductCollectionは、ProductModelクラスを持つ特定のクエリの結果です。独自のデータベーステーブルは必要ありません。

+0

私は質問をいくらかシンプルにしたいと思っていましたが、実際には私の製品はそれらの下にネストされた別のモデルを持っています。あなたのメソッドを使ってそれらを更新することは可能でしょうか?私はaccepts_nested_attributes_forという考え方をしていました。なぜなら、複数のレベルの入れ子を作るのは簡単だからです。 – tquill

+0

私はあなたがそうすることができると信じています。これらのパラメータでは、ネストされた値にする必要があります。たとえば、itemにネストされた属性を受け入れる場合、変更パラメータ内にitem_attributes:{updated_at:Time.now} –

関連する問題