dependent: :destroyを中間テーブル関係先につけてると発生するエラー

中間テーブルで関係を持っている親同士のテーブルにdependent: :destroyをつける時に発生するエラーについて書いていきたいと思います。

deviseの編集機能(registrations/edit.html.erb)でアカウントを削除しようとした際に発生するエラーになります。

registrations/edit.html.erb

<p>Unhappy? <%= button_to "Cancel my account", registration_path(resource_name), data: { confirm: "Are you sure?" }, method: :delete %></p>

デフォルトだとこの様になっているコードがアカウントの削除を担ってくれます。

モデルの状況がこちらです。

 has_many :game_player, dependent: :destroy
  has_many :game, through: :game_players, dependent: :destroy
  has_many :grades, through: :game_players, dependent: :destroy
  has_many :posts, dependent: :destroy
  has_many :comments, dependent: :destroy

この場合、games,gradeまで消そうとする状態になってしまうため、こちらのようなエラーが発生してしまいます。 解決方法としては、親としてのつながりのあるgames,gradeからdependent: :destroyを消すことで解決することができます。 中間テーブルも同時に消していきたい場合は、中間テーブルのみにdependent: :destroyを記述するようにしましょう。