Добавлять ассоциации к существующим моделям
Мне интересно, как я могу добавлять ассоциации к моим моделям. Предположим, я генерирую две модели
rails generate model User
rails generate model Car
Теперь я хочу добавить ассоциации, чтобы модели получили форму
class User < ActiveRecord::Base
has_many :cars
end
class Car < ActiveRecord::Base
belongs_to :user
end
Возникает вопрос: как применить эту модификацию путем миграции, чтобы получить таблицу cars_users в базе данных? Я планирую использовать эту таблицу в своем коде.
Ответы
Ответ 1
belongs_to
ассоциация ожидает столбец association_id
в соответствующей таблице. Поскольку автомобили принадлежат пользователю, таблица автомобилей должна иметь столбец user_id
. Это можно сделать двумя способами.
сначала вы можете создать столбец при создании модели
rails g model car user_id:references
или просто добавьте user_id после создания модели, например, ответа Ричарда Брауна. Будьте осторожны, если вы используете integer
вместо references
, вам нужно будет создать индекс самостоятельно.
rails g migration add_user_id_to_cars user_id:integer
то в сгенерированной миграции добавьте
add_index :cars, :user_id
UPDATE:
Как отметил Джозеф в комментариях, необходимость добавления индекса вручную уже была рассмотрена в текущей версии Rails. Я думаю, что это было введено в Rails 4. Вы можете узнать больше об этом в официальном руководстве Rails для переноса. Суть его заключается в следующем генераторе
bin/rails g migration add_user_to_cars user:references
создаст миграцию с линией, похожей на
add_reference :cars, :user, index: true
Это добавит столбец user_id
в таблицу автомобилей, а также отметит этот индекс для индексирования.
Ответ 2
Следуя @jvnill объяснению в рельсах 4 (и, возможно, в рельсах 3.2 тоже), вы можете сделать это так же (избегая идентификационных частей и запоминая точные конвекции):
rails g migration AddUserToCar user:references
который создаст следующую миграцию, заботясь о добавлении столбца и индекса со всеми правильными соглашениями:
class AddUserToCar < ActiveRecord::Migration
def change
add_reference :cars, :user, index: true
end
end
В конце, как всегда, выполните миграцию:
rake db:migrate
Просмотрите ваш schema.rb
для просмотра нового индекса и столбца user_id.
Ответ 3
Сгенерировать перенос для создания ассоциации:
rails g migration AddUserIdToCars user_id:integer
rake db:migrate
Ответ 4
Файл миграции:
class Createuser < ActiveRecord::Migration[5.0]
def change
create_table :users do |t|
t.string :name
end
create_table :cars do |t|
t.belongs_to :user, index: true
t.varchar(255) :model
t.varchar(255) :color
end
end
end