Подтвердить что ты не робот

Добавлять ассоциации к существующим моделям

Мне интересно, как я могу добавлять ассоциации к моим моделям. Предположим, я генерирую две модели

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 в базе данных? Я планирую использовать эту таблицу в своем коде.

4b9b3361

Ответ 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