質問: railsで userある決まった商品のなかからどの商品を扱うかを決めて、その商品に値段をつけるとします。 モデルは userモデル・user_product_categoryモデル・product_categoryモデル という3つのモデルが有り、user_product_categoryモデルはpriceというカラムを持っています。 そしてuser_product_categoryコントローラのcreateではproduct_categoryモデルの一覧があり、そこにチェックボックスをつけて値段を入れるとユーザープロフィールページに表示されるようにしたいです。 条件としては 1・どの商品を取り扱うか、取り扱わないかをユーザープロフィール編集ページではない1ページで更新したい。(中間テーブルのみを一括更新したい。) 2・値段もそのページで変更可能にしたい。 この時どのようにformを作ったりコントローラを書けばよいでしょうか。 調べて、 ``` <% ProductCategory.all.each do |product_category| %> <%= check_box_tag "user[product_category_ids][]", product_category.ids, f.object.product_categories.include?(product_category) %> ``` とやることでチェックボックスがついたものだけparamsに入れられるのはわかってきたのですが、これだと複数一括で登録する場合バリデーションが一括出できない気がして・・・ また、ユーザーモデルとひも付けて ``` def user_params params.require(:user).permit(:name,{product_category: [] }) end ``` でユーザーごとsaveすればいいとも書いてあったのですが、これだとpriceカラムをどのように入れればいいのかわからないというのがありまして・・・ 何解決策はないか教えて下さい。お願いします。 追記 Userモデルははusernameカラムを持ち ``` has_many :user_product_category has_many :product_category through: :user_product_category ``` user_product_categoryは ``` belongs_to :users belongs_to :product_category ``` でカラムとしては ``` user_id, :integer product_category_id, :integer price, :integer ``` product_categoryはnameカラムをもっていて ``` has_many :user_product_category has_many :users through: :user_product_category ``` を持っている状態です createメソッドについてやりたいことは 1・まず、ProductCategories.allで手に入る全製品カテゴリ名をチェックボックスで表示 2・checkboxの横に数字を入れるテキストフィールドがありpriceを入力する 3・更新を押すとuser_product_categoryコントローラにparamsが飛んで checkboxがついてる製品カテゴリの中間テーブルを生成。 checkboxがあったが外れたものについては削除。 さらにpriceフィールドのバリデーションをする 例えば user_id=1のユーザーAがおり 製品カテゴリ1(id=1) 製品カテゴリ2(id=2) 製品カテゴリ3(id=3) があるとして ユーザーAは最初に製品カテゴリ1にチェックし、1000円と入力する ↓ user_product_categoryテーブルで id=1 user_id=1 product_categories_id=1 price=1000 というレコードが生成される 次にユーザーAは製品カテゴリ1のチェックを外し、製品カテゴリ2と製品カテゴリ3のチェックを付け、両方共にprice=1200を入力し更新ボタンを押す ↓ user_product_categoryテーブルで id=1のレコードはチェックが外れたので削除 id=2 user_id=1 product_categories_id=2 price=1200 id=3 user_id=1 product_categories_id=3 price=1200 というレコードが生成される こんな感じにしたいです。 ただこの時strong parameterはどのように書くのかとかどうやって一括でpriceフィールドのバリデーションするかとか全く思いつきませんでした。 いい方法があったら教えて頂きたいです。
回答: 参考情報 * Nested model (attributes)とは > > ... > > Railsの超便利機能で、親と子の関係もしくはhas one関係を"nested"と指定することで、 > > 親を作成時に同時に子も作成してしまうことができる。 > > ... > > > * 1対多のリレーションモデルと入れ子フォームの実装のポイント > > ... > > > * Railsでaccepts_nested_attributes_forとfields_forを使ってhas_many関連の子レコードを作成/更新するフォームを作成 ここらあたりを起点に、調査していくとよいと思います。