4

我可以輕鬆地創建在Rails腳手架或模型字段,它是引用(外鍵)到另一種模式:可能將列添加到作爲外鍵的ActiveRecord模型?

rails g model Cat owner:references 
rails g scaffold Cat owner:references 

但我似乎無法在一個添加一列做同樣的遷移:

rails g migration AddOwnerToCats owner:references 

什麼上面確實是產生這樣的遷移文件:

class AddOwnerToCats < ActiveRecord::Migration 
    def change 
    add_column :cats, :owner, :references 
    end 
end 

當我試着和rake db:migrate運行它,我得到這個:

SQLite3::SQLException: near "references": syntax error: ALTER TABLE "cats" ADD "owner" references 

那麼有沒有辦法添加一個引用另一個模型的列?或者我只需要做:

rails g migration AddOwnerToCats owner_id:integer 

然後進入遷移並添加索引owner_id

+0

如果你看到rails generator模板,你可以看到它會盲目地接受你的命令發送的參數,所以如果你發送rails g migration addOwnerToCats owner_id:your_name它將創建一個字段爲your_name的遷移文件... –

+1

我認爲'references'只能在'create_table'或'change_table'中使用。所以是的,只是做'add_column:貓,:owner_id,:整數',然後'add_index:貓,:owner_id' – j03w

+0

@Rajarshi - 我假設儘可能多.. –

回答

0

我可以想到的一種解決方法是解決方法是簡單地創建列並在模型中給出連接條件。即

has_many :x, :class_name => y, :foreign_key => z 
+0

這不會是一個外鍵,因爲該列上沒有索引 –

0

我知道這是一個老問題,但Rails的5(或許更早版本)中,official docs已更新:

rails generate migration AddOwnerRefToCats owner:references 

會產生

class AddOwnerRefToCats < ActiveRecord::Migration[5.0] 
    def change 
    add_reference :cats, :owner, foreign_key: true 
    end 
end 

你也可以添加, index: true來創建索引。