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

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

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

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

Q&A

1回答

567閲覧

has_many, belongs_toの関係を変更したい

tarotarotarotar

総合スコア41

Ruby on Rails

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

0グッド

0クリップ

投稿2021/12/12 23:59

ruby on rails で開発を行っているのですが、以下の質問をさせてください。

  • userモデル
  • customerモデル

という2つのモデルがあります。

customerは

ruby

1has_many :user, dependent: :destroy

となり、対してuserは

ruby

1belongs_to :customer

とっています。

  • customer A
  • customer B
  • user C

というレコードを例にします。

  1. customer Aを作成時にuser Cを紐付けた
  2. customer Aを削除したい
  3. でもuser Cは削除したくない (紐づくcustomerBにしたい)

上記が今回解決したい事項です。

★補足事項

  • userテーブルにはcustomer_idという外部キーがある
  • user Cが持つcustomer_idAB に変更してみたが、customer Aを削除すると相変わらずuser Cは削除されてしまう。

よろしくおねがいいたします。

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

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

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

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

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

maisumakun

2021/12/13 01:37 編集

> user Cが持つcustomer_idを A → B に変更してみたが、customer Aを削除すると相変わらずuser Cは削除されてしまう。 user Cの変更後に保存した上で、customer Aを再読み込みなどしてみてはどうでしょうか? (正しくデータが取れれば、user Cの変更を保存した後にcustomer Aとの関係は残らないはずです)
tarotarotarotar

2021/12/13 02:48 編集

すみません、自分が誤っている部分がありまして、 > user Cが持つcustomer_idを A → B に変更 する際にuser Cを持っているcustomerがA, Bの2者になるようです。 そのためcustomer Aを削除する際に、user Cも削除されてしまうと予測してます。 そこで、customer Aが持つuser Cを削除されても良いuser Dに変更しようとしたところ、 Mysql2::Error: Cannot delete or update a parent row: a foreign key constraint fails というエラーになりました。 どうやらuser Dに変更しようとする際、なぜかuser Cを削除する処理が動き、 「user CはcustomerB に紐付いているから削除できないよ!」 というエラー内容と見られます。。。 これが解決出来ない状態です...
maisumakun

2021/12/13 02:51

どのようにコードで書いたのですか? (すでに書いたように、customer Aが古いデータを持ってしまっていて、本来無関係になったはずのuser Cに影響している、ということが考えられます)
maisumakun

2021/12/13 02:52

> user Cを持っているcustomerがA, Bの2者になるようです。 user belongs_to customerである以上、「正しくデータを取れている状況なら」起きません。
tarotarotarotar

2021/12/13 02:58

> user Cを持っているcustomerがA, Bの2者になるようです。 reloadコマンドをおこなったうえで確認したところ、user Cを持っているcustomerを確認したらcustomer Bのみになっておりました! その後削除を行ったところ、理想の挙動となりました。 助かりました! ありがとうございます。
guest

回答1

0

has_many :user, dependent: :destroy

dependentを消したら、連動で削除されなくなります。

has_many :user

投稿2021/12/13 05:56

heroyct

総合スコア434

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問