2010-05-29 1 views
67

Так что у меня create_table как это для курсов в школе:Rails migration: t.references с альтернативным именем?

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 

ответ

12

Я думаю, что эта нить имеет другой более Rails-иш способ: Scaffolding ActiveRecord: two columns of the same data type

В миграции:

t.belongs_to: transferrable_as

t.belongs_to: same_as

+1

но как же дб знать, какой внешний ключ, чтобы связать таблицу? Я пытаюсь сделать это с помощью базы данных Postgres, и это дает мне ошибку 'PG :: UndefinedTable: ERROR', она пытается добавить ограничение внешнего ключа в таблицу, которая не существует. –

+0

Может ли ОА прокомментировать, почему они приняли этот ответ? 'belongs_to' - просто псевдоним для' ссылок', который вы уже пробовали. Если вы получили миграцию на работу, вы каким-либо образом изменили ее из этого ответа? –

+0

Я справился. См. Мой ответ на этот вопрос. –

3

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

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

Вы можете сделать это следующим образом:

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 
+4

Часть того, что не удалось добавить 'foreign_key: true' в линии ссылок, было тем, что меня отключило. Добавление 'add_foreign_key' и указание имени столбца для них сделали трюк. –

+0

Это работает из коробки в Rails? Согласно http://stackoverflow.com/a/22384289/239657, для этого требуется драгоценный камень 'schema_plus'. Rails '[add_reference] (http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_reference) docs не упоминает опции: ссылки. –

+0

Он работает из коробки на Rails 4.2 в моем опыте. Интересное наблюдение об этом варианте и отсутствие в документах. Эти документы также говорят, что опция: foreign_key доступна, но я обнаружил, что это не так. Возможно, какой-то метод называется так или иначе. –

3

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

belongs_to :transferrable_as, class_name: "Course" 
    belongs_to :same_as, class_name: "Course" 
62

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

t.references :transferable_as, index: true, foreign_key: { to_table: :courses } 
t.references :same_as, index: true, foreign_key: { to_table: :courses } 
+6

Это работает на Rails 5.1, и ни один из других предложений не делает. Он намного чище и чувствует себя хорошо. – stephenmurdoch

+2

Я использую Rails 5.1.4, но он не работает. Когда я укажу опцию 'foreign_key' в создании таблицы, как это делают, она вызывает ошибку, говорящую, что сама таблица, которую я создаю, не существует ... Поэтому я подозреваю, что это не поддерживается официальным API. – Quv

 Смежные вопросы

  • Нет связанных вопросов^_^