回答:
これはすべて、最初の移行/列定義で行うことができます(少なくとも現在はRails 5で)。
t.references :transferable_as, index: true, foreign_key: {to_table: :courses}
t.references :same_as, index: true, foreign_key: {to_table: :courses}
foreign_key
このようにテーブル作成でオプションを指定すると、作成しているテーブル自体が存在しないというエラーが発生します...したがって、公式のAPIでは実際にはサポートされていないようです。
index
すでにRailsののような外部キーに追加されstackoverflow.com/questions/39769981/...
あなたはこの方法でそれを行うことができます:
create_table :courses do |t|
t.string :name
t.references :transferrable_as
t.references :same_as
t.timestamps
end
またはt.belongs_to
のエイリアスとして使用t.references
foreign_key: true
これらの2つの参照行に追加することはできません。それらをデータベースレベルで外部キーとしてマークする場合は、次のように移行する必要があります。
add_foreign_key :courses, :courses, column: :transferrable_as_id
add_foreign_key :courses, :courses, column: :same_as_id
Rails 5.1以降では、次のようにcreate_table
ブロックの移行に外部キーを追加できます。
create_table :courses do |t|
t.string :name
t.references :transferrable_as, foreign_key: { to_table: 'courses' }
t.references :same_as, foreign_key: { to_table: 'courses' }
t.timestamps
end
foreign_key: true
参照行に追加できないことに関する部分は、私をつまずかせていたものでした。を追加し、add_foreign_key
それらの列名を指定するとうまくいきました。
schema_plus
gem が必要です。Railsのadd_reference docsには、:referencesオプションは含まれていません。
references:
とは対照的に、オプションが(ためであるt.references
FOREIGN_KEY配慮した、唯一のモデルレベルでの関連ではないことによっての世話をしているadd_foreign_key
?
t.references
は、「このテーブルに、別のテーブルの主キーであるフィールドを追加する」と言います。このreferences:
オプションは、どのテーブルが主キーであるかを示します(フィールドの名前で明確でない場合に必要です)。このadd_foreign_key
関数は、ここで参照整合性を強制するようにデータベースに指示します。
add_foreign_key
行は、何をどの外部キーであるかをデータベースに通知します。references:
パラメータは何もしません。
このスレッドには、Rails風の別の方法があると思います: Scaffolding ActiveRecord:同じデータ型の2つの列
移行中:
t.belongs_to:transferrable_as
t.belongs_to:same_as
PG::UndefinedTable: ERROR
試していますが、存在しないテーブルに外部キー制約を追加しようとするとエラーが発生します。
この質問に対する追加の回答として、関連付けを完了するには、モデルに次の行が必要です。
belongs_to :transferrable_as, class_name: "Course"
belongs_to :same_as, class_name: "Course"