だから私は学校のコースのためにこのようなcreate_tableを持っています:
create_table :courses do |t|
t.string :name
t.references :course
t.timestamps
end
しかし、私はそれを参照したいtwo他のコース:
has_many :transferrable_as # A Course
has_many :same_as # Another Course
次のように言えますか?
t.references :transferrable_as, :as=> :course
このスレッドはもっとRails風の方法があると思う: Scaffolding ActiveRecord:同じデータ型の2列
移行中:
t.belongs_to:transferrable_as
t.belongs_to:same_as
これはすべて、最初の移行/列定義で行うことができます(少なくとも現在のところRails 5):
t.references :transferable_as, index: true, foreign_key: {to_table: :courses}
t.references :same_as, index: true, foreign_key: {to_table: :courses}
次の方法で実行できます。
create_table :courses do |t|
t.string :name
t.references :transferrable_as, references: :courses
t.references :same_as, references: :courses
t.timestamps
end
またはt.belongs_to
のエイリアスとしてt.references
を使用する
これらの2つの参照行にforeign_key: true
を追加することはできません。データベースレベルで外部キーとしてマークする場合は、これを使用して移行する必要があります。
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
この質問に対する追加の回答として、関連付けを完了するには、モデルに次の行が必要です。
belongs_to :transferrable_as, class_name: "Course"
belongs_to :same_as, class_name: "Course"
references
は:as
オプションを受け入れないと思いますが、列を手動で作成できます...
create_table :courses do |t|
t.string :name
t.integer :course1_id
t.integer :course2_id
t.timestamps
end