2011-12-03 60 views
4

我是Rails的新手,我從Django的背景來看它。我已經認識到模型和數據庫模式在Rails的在線Django中是分開的。不過,我仍然在處理遷移問題。Rails 3:belongs_to,has_one和Migrations

我的問題很簡單 - 我如何使用遷移向模型添加關係?例如,我有ArtistSong作爲目前子類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',或者如果你想對你的表進行一些修改,就像上面的語法一樣。你可以在這裏閱讀更多關於遷移的內容:http://guides.rubyonrails.org/migrations.html – rabusmar

+0

謝謝。我使用了'change_table',但現在當我在ActiveAdmin中選擇「歌曲」時,我得到'沒有這樣的列:artists.song_id'。我做錯了什麼?該專欄不應該存在,因爲藝術家可以有許多歌曲... –

6

現在,在導軌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 procedure:references'? –

+0

您的權利@QuangVan,我更新了我的答案..應該是單數 – prasanthrubyist