Миграция Rails: t.references с альтернативным именем? - PullRequest
99 голосов
/ 29 мая 2010

Итак, у меня есть такая create_table для курсов в школе:

create_table :courses do |t|
  t.string :name
  t.references :course
  t.timestamps
end

но я хочу сослаться на два других курсов, таких как:

has_many :transferrable_as # A Course
has_many :same_as          # Another Course

Могу я сказать следующее?

t.references :transferrable_as, :as=> :course

Ответы [ 5 ]

126 голосов
/ 17 декабря 2016

Вы можете сделать все это в первоначальном определении миграции / столбца (по крайней мере, в настоящее время в Rails 5):

t.references :transferable_as, index: true, foreign_key: {to_table: :courses}
t.references :same_as, index: true, foreign_key: {to_table: :courses}
78 голосов
/ 10 августа 2015

Вы можете сделать это так:

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

Вы не можете добавить foreign_key: true к этим двум ссылочным строкам. Если вы хотите пометить их как внешние ключи на уровне базы данных, вам нужно выполнить миграцию с этим:

add_foreign_key :courses, :courses, column: :transferrable_as_id
add_foreign_key :courses, :courses, column: :same_as_id
12 голосов
/ 29 мая 2010

Я думаю, что этот поток имеет другой, более Rails-способ: Леса ActiveRecord: два столбца одного типа данных

В миграции:

t.belongs_to: Transferrable_as

t.belongs_to: same_as

5 голосов
/ 13 июля 2016

В качестве дополнительного ответа на этот вопрос - Модель должна иметь следующую строку для завершения ассоциации:

    belongs_to :transferrable_as, class_name: "Course"
    belongs_to :same_as, class_name: "Course"
3 голосов
/ 29 мая 2010

Я не думаю, что references принимает опцию :as, но вы можете создавать свои столбцы вручную ...

create_table :courses do |t| 
  t.string  :name 
  t.integer :course1_id
  t.integer :course2_id 
  t.timestamps 
end 
...