2011-02-10 65 views
158

如果我創建一個新的Rails 3的遷移與(例如)Rails 3遷移:添加引用列?

rails g migration tester title:tester user:references 

,一切正常......但是如果我添加一列沿着線的東西:

rails g migration add_user_to_tester user:references 

的參考字段不被識別。簡而言之,問題是:如何在命令行中將引用列添加到rails遷移?

回答

203

如果您使用的是Rails 4。X您現在可以生成引用遷移,就像這樣:

rails generate migration AddUserRefToProducts user:references 

就像你可以看到rails guides

186

編輯:這是一個過時的答案,不應該適用於Rails的4.x版+

你並不需要添加引用時,你可以使用一個整數ID到你引用的類。

我想說的是,使用引用而不是普通整數的好處在於,該模型將與belongs_to一起預定義,並且由於該模型已經創建,並且在遷移現有內容時不會受到影響,因此目的是丟失。

所以我會做這樣的代替:

rails g migration add_user_id_to_tester user_id:integer 

,然後手動添加belongs_to的:用戶在測試模型

+9

但是,這不會帶來支持它的數據庫中的相應的外鍵約束,對不對? – abahgat 2011-05-02 09:02:55

+19

不,afaik Rails從不在數據庫上創建外鍵約束,除非你添加插件來爲你做。 – DanneManne 2011-05-03 02:44:42

+0

剛剛學習這篇文章,請問我如何添加引用 – 2012-07-19 01:31:10

100

請注意,您將很可能需要對列的索引了。

class AddUserReferenceToTester < ActiveRecord::Migration 
    def change 
    add_column :testers, :user_id, :integer 
    add_index :testers, :user_id 
    end 
end 
8

當添加一列你需要做的是列一個整數,如果可能的話堅持使用Rails的慣例。所以對於你的情況,我假設你已經有一個測試人員和用戶模型,以及測試人員和用戶表。

要添加您需要創建一個名爲user_id的整數列外鍵(慣例):

add_column :tester, :user_id, :integer 

然後一個belongs_to的添加到測試儀型號:

class Tester < ActiveRecord::Base 
    belongs_to :user 
end 

,你可能還希望爲外鍵添加索引(這是參考文獻已經爲您所做的):

add_index :tester, :user_id 
50

通過上述兩個步驟,您仍然缺少外鍵約束。這應該工作:

class AddUserReferenceToTester < ActiveRecord::Migration 
     def change 
      add_column :testers, :user_id, :integer, references: :users 
     end 
    end 
3

你可以到你的模型通過命令行通過以下方式添加引用:

rails g migration add_column_to_tester user_id:integer 

這將生成一個遷移文件,如:

class AddColumnToTesters < ActiveRecord::Migration 
    def change 
    add_column :testers, :user_id, :integer 
    end 
end 

這工作正常我每次使用它..

8

這將這樣的伎倆:

rails g migration add_user_to_tester user_id:integer:index 
27

運行rails g migration AddUserRefToSponsors user:references將產生以下遷移:

def change 
    add_reference :sponsors, :user, index: true 
end 
3

For Rails 4

生成器接受列類型作爲參考(也可作爲belongs_to)。

這種遷移會創建一個user_id列和相應的索引:

$ rails g migration AddUserRefToProducts user:references 

生成:

class AddUserRefToProducts < ActiveRecord::Migration 
    def change 
    add_reference :products, :user, index: true 
    end 
end 

http://guides.rubyonrails.org/active_record_migrations.html#creating-a-standalone-migration

對於導軌3

助手被稱爲參考文獻(也可作爲belongs_to)。

此遷移將創建適當類型的category_id列。請注意,您傳遞的是模型名稱,而不是列名稱。活動記錄爲您添加_id

change_table :products do |t| 
    t.references :category 
end 

如果你有多態性belongs_to協會則引用將同時添加所需的列:

change_table :products do |t| 
    t.references :attachment, :polymorphic => {:default => 'Photo'} 
end 

將與Photo默認值添加一個attachment_id列和字符串attachment_type列。

http://guides.rubyonrails.org/v3.2.21/migrations.html#creating-a-standalone-migration