2011-12-03 3 views
4

Я новичок в Rails, и я прихожу к нему с фона Django. Я пришел к соглашению с тем, что модели и схема базы данных являются отдельными в Rails, онлайн-Django. Тем не менее, я все еще понимаю, что происходит с миграциями.Rails 3: принадлежит_to, has_one и Migrations

Мой вопрос довольно прост - как мне добавить отношение к модели с помощью миграции? Например, у меня есть Artist и Song как пустые модели, которые подкласс ActiveRecord::Base на данный момент, без каких-либо отношений.

мне нужно двигаться, чтобы сделать это:

class Artist < ActiveRecord::Base 
    has_many :songs 
end 

class Song < ActiveRecord::Base 
    belongs_to :artist 
end 

Но как я могу изменить схему, чтобы отразить это с помощью rails g migrate? Я использую Rails 3.1.3.

ответ

4

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

def change 
    create_table :songs do |t| 
    t.references :artist 
    end 

    add_index :songs, :artist_id 
end 
+0

ОК - и что, если это существующая таблица, мне нужно использовать что-то другое, кроме 'create_table'? –

+3

В этом случае вы можете использовать 'add_column: songs,: artist_id,: int', или если вы хотите внести несколько изменений в таблицу' change_table' с синтаксисом, подобным приведенному выше. Подробнее о миграции вы можете прочитать здесь: http://guides.rubyonrails.org/migrations.html – rabusmar

+0

Спасибо. Я использовал 'change_table', но теперь, когда я перехожу в« Песни »в ActiveAdmin, я получаю' no такой столбец: artist.song_id'. Я сделал что-то не так? Эта колонка не должна существовать, поскольку у исполнителя может быть много песен ... –

6

Теперь в Rails 4 вы можете сделать:

class AddProcedureIdToUser < ActiveRecord::Migration 
    def change 
    add_reference :users, :procedure, index: true 
    end 
end 

к существующей модели

4

Вы можете произвести миграцию

rails g migration AddProcedureIdToUser procedure:references 

Спасибо

+0

Должны ли это быть особые процедуры? 'rails g migration AddProcedureIdToUser процедура: ссылки'? –

+0

Ваше право @QuangVan, я обновил свой ответ .., который должен быть сингулярным – prasanthrubyist

Смежные вопросы