質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Q&A

1回答

2843閲覧

多対多のテーブルで 保存時に 重複する内容があるときに 中間テーブルのみ作成、保存するときについて

shuzi

総合スコア197

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

0グッド

0クリップ

投稿2019/06/13 10:18

多対多のモデル関係で下記のようにあったときに

item <=> list
item <=> category

ruby

1item {id:1, name: "財布"} 2 3list {id:1, name: "ブランド"4 5category {id:1, name: "ファッション"}

item_lists

ruby

1 item_id : 1 list_id: 1

などのデータがある中で新規listを登録する際に

ruby

1item {id:2, name: "安い財布"} 2 3list {id:2, name: "セール"4 5category {id:1, name: "ファッション"}

カテゴリーを登録することなく
カテゴリーの中間テーブルだけを更新するのに

controller

1@item = params.require(:item).inject(0){|i,item| @user.items.build(name: dict.permit(Dict::NESTED_ALLOWED_PARAMS)[:text])} 2 //存在確認 3  if params.require(:category).present? 4 //modelに存在していないかチェック。すでに重複する内容があれば中間テーブルを更新 5   if params.require(:category).inject(0){ |i,c| Category.where(name: c[:name]).ids}.present? 6 cate = @item.item_categoryies.build 7 params.require(:category).inject(0){|i,c| cate.category = Category.where(name: c[:name])[0]} 8 else 9 params.require(:category).inject(0){|i,cate| @item.categories.build(name: cate.permit(Category::NESTED_ALLOWED_PARAMS)[:name])} 10 end 11 end

あまりにも汚いコードなのでこれをどう書くときれいに処理できるのでしょうか?

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

無ければ作る find_or_create_by で記載するとか

ruby

1params.require(:category).each do |_i, c| 2 @item.item_categories.find_or_create_by(category_id: c[:id]) 3end

もしくは、そもそも中間テーブルなので必ず差分更新しないといけない(他所でitem_category.idを参照している等)ではないですよね?
いっそ毎回既存の値を消して全部作り直すという手もあるかと

ruby

1@item.item_categories = params.require(:category).map do |_i, c| 2 ItemCategory.new(item_id: item.id, category_id: c[:id]) 3end

投稿2019/06/14 04:32

Ighrs

総合スコア656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shuzi

2019/06/14 04:49

find_or_create_by !! こんな便利なメソッドがあるんですねっ!凄いっ 参照をしているので差分更新したいんですよね。 まずは上記のメソッドをつかって書き直してみますっ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問