Rails Active Record ステートメントが無効な未定義の列です

概要

私は Ruby on Rails と Active Record を使用するのがまったく初めてです。 なぜこのエラーが繰り返し発生するのか理解できないようです。 destroy メソッドを使用してサッカー チームを削除しようとしていますが、機能しません。完全なエラーの内容は次のとおりです。 ActiveRecord::StatementInvalid (PG::UnknownColumn: エラー: 列matches.team_idが存在しません LINE 1: SELECT “matches”.* FROM “matches” WHERE “matches”.”team_id” … ^ ): 各試合には 2 つのチームがあり、1 つのチームには多くの試合と選手を含めることができます。クラスは次のようになります。

class Team < ApplicationRecord
    has_many :players , dependent: :destroy
    has_many :matches, foreign_key: "team_id", dependent: :destroy
end
class Match < ApplicationRecord
  belongs_to :teamA, foreign_key: "team_id", class_name: "Team"
  belongs_to :teamB, foreign_key: "team_id", class_name: "Team"
end

class CreateMatches < ActiveRecord::Migration[7.0]
  def change
    create_table :matches do |t|
      t.references :teamA, foreign_key: { to_table: :teams }
      t.references :teamB, foreign_key: { to_table: :teams }
      t.index: :teams, :teams_id, unique: true
      t.boolean :state
      t.string :result

      t.timestamps
    end
  end
end

何が問題だと思われますか? 外部キーを推奨する投稿をいくつか見たため、外部キーを使用してこれらの関連付けを機能させようとしましたが、私にとっては機能しませんでした。

解決策

コメントで指摘されているように、チームにはteam_id列はありませんが、teamA_idとteamB_idがあり、それらを別々に指定すると、#destroyを呼び出すことができます

class Team < ApplicationRecord
  has_many :players , dependent: :destroy
  has_many :matches_as_A_team, foreign_key: "teamA_id", class_name: 'Match', dependent: :destroy
  has_many :matches_as_B_team, foreign_key: "teamB_id", class_name: 'Match'. dependent: :destroy
end

しかし、率直に言って、素晴らしいデザインではありません。私は別のアプローチをお勧めします…おそらく、試合テーブル、チームテーブル、そして試合とチームの両方に属する結合テーブル「matches_teams」です。試合におけるチームの役割に関する情報を結合テーブル自体に入れることができます (たとえば、ホーム チームの場合は true、アウェイ チームの場合は false というブール値の「ホーム」)。