4

я могу легко создать леску или модели в Rails с полем, которое является ссылкой (внешний ключ) на другую модель:Можно добавить столбец в модель ActiveRecord, которая является внешним ключом?

rails g model Cat owner:references 
rails g scaffold Cat owner:references 

Но я не могу сделать то же самое для добавления столбца в миграция:

rails g migration AddOwnerToCats owner:references 

Вышеприведенный делает производить миграцию файла, как это:

class AddOwnerToCats < ActiveRecord::Migration 
    def change 
    add_column :cats, :owner, :references 
    end 
end 

и когда я пытаюсь запустить его с rake db:migrate, я получаю это:

SQLite3::SQLException: near "references": syntax error: ALTER TABLE "cats" ADD "owner" references 

Так есть способ добавить столбец, который является ссылкой на другую модель? Или я просто должен сделать:

rails g migration AddOwnerToCats owner_id:integer 

И затем перейти в миграции и добавить индекс для owner_id?

+0

Если вы видите шаблон генератора рельсов, вы можете увидеть, что он будет слепо принимать аргумент, который вы отправляете по вашим командам, поэтому, если вы отправляете рельсы g migration addOwnerToCats owner_id: your_name, он создаст файл миграции с вашим именем в качестве поля ... –

+1

Я думаю, что 'ссылки' работают только в' create_table' или 'change_table'. Итак, да, просто сделайте 'add_column: cats,: owner_id,: integer', затем' add_index: cats,: owner_id' – j03w

+0

@Rajarshi - я так полагал .. –

ответ

0

Один из способов, о котором я могу думать, является обходным путем, просто создайте столбец и дайте условие соединения в модели. т.е.

has_many :x, :class_name => y, :foreign_key => z 
+0

Это не будет внешний ключ в том смысле, что в этом столбце нет индекса –

0

Я знаю, что это старый вопрос, но на Rails 5 (и, возможно, более ранние версии), то official docs были обновлены:

rails generate migration AddOwnerRefToCats owner:references 

сгенерирует

class AddOwnerRefToCats < ActiveRecord::Migration[5.0] 
    def change 
    add_reference :cats, :owner, foreign_key: true 
    end 
end 

Вы также можно добавить , index: true для создания индекса.