私は 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 というブール値の「ホーム」)。