web-dev-qa-db-ja.com

Rails migration:t.references with alternative name?

だから私は学校のコースのためにこのような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
104
themirror

このスレッドはもっとRails風の方法があると思う: Scaffolding ActiveRecord:同じデータ型の2列

移行中:

t.belongs_to:transferrable_as

t.belongs_to:same_as

12
themirror

これはすべて、最初の移行/列定義で行うことができます(少なくとも現在のところRails 5):

t.references :transferable_as, index: true, foreign_key: {to_table: :courses}
t.references :same_as, index: true, foreign_key: {to_table: :courses}
138
Ryan

次の方法で実行できます。

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
80
Toby 1 Kenobi

この質問に対する追加の回答として、関連付けを完了するには、モデルに次の行が必要です。

    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 
3
Ju Nogueira