2013-03-13 3 views
34

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

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

+5

у вас нет необходимости в 'cars_users' таблицы, так как вы не имеете много-ко-многим. – Zippie

ответ

55

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. Вы можете узнать больше об этом в official Rails guide for migrations. Суть ее работы следующий генератор

bin/rails g migration add_user_to_cars user:references 

создаст миграцию с линией, аналогичной

add_reference :cars, :user, index: true 

Это добавит user_id столбец в таблице автомобилей, и это будет также отметить, что столбец индексироваться.

+0

просто любопытство: что если между моделями была has_and_belongs_to_many ассоциация. Кто будет тогда ответственен за создание таблицы cars_users? Я, Рубин на рельсах или кто-то еще? – Andrew

+3

вы. habtm join tables не нужен класс, но все равно нужна таблица, и вам нужно создать миграцию для этого: – jvnill

+2

Вместо этого в два этапа вы можете добавлять ссылки после создания модели следующим образом: 'rails g migration addUserReferencesToCars user : references'. Это позаботится о добавлении 'user_id' в' cars' и делает его индексом одним выстрелом. – Joseph

7

Сформировать миграции, чтобы создать ассоциацию:

rails g migration AddUserIdToCars user_id:integer 
rake db:migrate 
15

После @ объяснений jvnill в рельсов 4 (и, возможно, в рельсах 3.2 тоже), вы можете сделать это, как это тоже (избегая части идентификаторов и запоминание точных convetions):

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.

0

миграции файла:

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