Ответ 1
Если вы используете Rails 4.x, теперь вы можете создавать миграции со ссылками, например:
rails generate migration AddUserRefToProducts user:references
как вы можете видеть на направляющих рельсов
Если я создаю новую миграцию рельсов 3 (например)
rails g migration tester title:tester user:references
все работает отлично... однако, если я добавлю столбец с чем-то вроде строк:
rails g migration add_user_to_tester user:references
ссылка поле не распознается. Короче говоря, возникает вопрос: как добавить столбец ссылок к миграции рельсов из командной строки?
Если вы используете Rails 4.x, теперь вы можете создавать миграции со ссылками, например:
rails generate migration AddUserRefToProducts user:references
как вы можете видеть на направляющих рельсов
EDIT. Это устаревший ответ и не должен применяться для Rails 4.x +
Вам не нужно добавлять ссылки, если вы можете использовать целочисленный идентификатор для указанного класса.
Я бы сказал, что преимущество использования ссылок вместо простого целого состоит в том, что модель будет предопределена с помощью role_to, и так как модель уже создана и не будет затронута при переносе чего-либо существующего, цель будет потеряна.
Итак, я бы сделал так:
rails g migration add_user_id_to_tester user_id:integer
И затем вручную добавьте принадлежность к пользователю: в модели тестера
Обратите внимание, что вам, скорее всего, понадобится индекс в этом столбце.
class AddUserReferenceToTester < ActiveRecord::Migration
def change
add_column :testers, :user_id, :integer
add_index :testers, :user_id
end
end
С двумя предыдущими шагами, указанными выше, вам все еще не хватает ограничения внешнего ключа. Это должно работать:
class AddUserReferenceToTester < ActiveRecord::Migration
def change
add_column :testers, :user_id, :integer, references: :users
end
end
Вы можете использовать ссылки в миграции изменений. Это действительный код Rails 3.2.13:
class AddUserToTester < ActiveRecord::Migration
def change
change_table :testers do |t|
t.references :user, index: true
end
end
def down
change_table :testers do |t|
t.remove :user_id
end
end
end
c.f.: http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table
Запуск rails g migration AddUserRefToSponsors user:references
приведет к следующей миграции:
def change
add_reference :sponsors, :user, index: true
end
При добавлении столбца вам нужно сделать этот столбец целым числом и, если возможно, придерживаться правил рельсов. Поэтому для вашего случая я предполагаю, что у вас уже есть модели Tester и User, а также тестеры и таблицы пользователей.
Чтобы добавить внешний ключ, вам нужно создать целочисленный столбец с именем user_id (соглашение):
add_column :tester, :user_id, :integer
Затем добавьте свойство принадлежность к модели тестера:
class Tester < ActiveRecord::Base
belongs_to :user
end
И вы также можете добавить индекс для внешнего ключа (это уже ссылки для вас):
add_index :tester, :user_id
Это сделает трюк:
rails g migration add_user_to_tester user_id:integer:index
Вы можете добавить ссылки на свою модель через командную строку следующим образом:
rails g migration add_column_to_tester user_id:integer
Это приведет к созданию файла миграции, например:
class AddColumnToTesters < ActiveRecord::Migration
def change
add_column :testers, :user_id, :integer
end
end
Это отлично работает каждый раз, когда я его использую.
Для Rails 4
Генератор принимает тип столбца в качестве ссылок (также доступен как belongs_to
).
Эта миграция создаст столбец user_id
и соответствующий индекс:
$ rails g migration AddUserRefToProducts user:references
генерирует:
class AddUserRefToProducts < ActiveRecord::Migration
def change
add_reference :products, :user, index: true
end
end
http://guides.rubyonrails.org/active_record_migrations.html#creating-a-standalone-migration
Для Rails 3
Помощник называется ссылками (также доступен как belongs_to
).
Эта миграция создаст столбец category_id
соответствующего типа. Обратите внимание, что вы передаете имя модели, а не имя столбца. Активная запись добавляет _id
для вас.
change_table :products do |t|
t.references :category
end
Если у вас есть полиморфные ассоциации belongs_to
, тогда ссылки добавят оба требуемых столбца:
change_table :products do |t|
t.references :attachment, :polymorphic => {:default => 'Photo'}
end
Будет добавлен столбец attachment_id и столбец attachment_type
со значением по умолчанию Photo
.
http://guides.rubyonrails.org/v3.2.21/migrations.html#creating-a-standalone-migration