質問: やりたいこと ------ 以下のURLのようなサイトを作りたいです。 http://rails.densan-labs.net/form/many_to_many_form.html しかし、少し特殊なのは 多対多ですが、 商品の新規作成ページの際に、 商品カテゴリの部分は予め、フォームが用意されている点です。 (商品カテゴリを追加ボタンで一つ一つ追加するのではなく、 Category.allの数だけ予め用意しておく) そして、登録を押すと、 中間テーブルである ProductCategoryの定期購読(subscript)のカラム(boolean)の値が入るようなことをやりたいです。 上記URLではカテゴリを追加ボタンを押して一レコードずつ作成してましたが、 そうではなく、あらかじめ、全件の中間テーブルのレコードを用意しておきたいです。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/74d16a5948c8c011854f4dda6fdb0393.png) 現状の実装 ------ 現状の実装では、上記URLの通りしているため、 `accepts_nested_attributes_for` をmodelに定義した上で viewに `f.fields_for :xxxx do |ff|` を記述して実装しております。 しかし、この実装では、編集時にはやりたいようなことができますが、 新規登録時にはできません。 理由は、編集の時にはproductのidがあるため、以下の様な実装ができますが、 newの時にはidがないのでできません。 ``` @categories.each do |category| ProductCategory.find_or_create_by(product_id: params[:id], category_id: category.id) end ``` 別の方法として ------- view側でCategory.allのインスタンスをループさせてできないかなと考えたのですが、 この部分はよくわからず、手詰まり感を感じております。 ``` - @categories.all.each do |category| f.xxxxxxxx ``` どなたかアドバイスいただけないでしょうか? 不足事項は都度追加していきます。 よろしくお願いします。
回答: 中間モデルの`ProductCategory`インスタンスを`build`で生成しておいて、新規作成した`product`オブジェクトに`product.product_categories << ProductCategoryオブジェクト`のようにすれば、できると思います。