如果我創建一個新的Rails 3的遷移與(例如)Rails 3遷移:添加引用列?
rails g migration tester title:tester user:references
,一切正常......但是如果我添加一列沿着線的東西:
rails g migration add_user_to_tester user:references
的參考字段不被識別。簡而言之,問題是:如何在命令行中將引用列添加到rails遷移?
如果我創建一個新的Rails 3的遷移與(例如)Rails 3遷移:添加引用列?
rails g migration tester title:tester user:references
,一切正常......但是如果我添加一列沿着線的東西:
rails g migration add_user_to_tester user:references
的參考字段不被識別。簡而言之,問題是:如何在命令行中將引用列添加到rails遷移?
如果您使用的是Rails 4。X您現在可以生成引用遷移,就像這樣:
rails generate migration AddUserRefToProducts user:references
就像你可以看到rails guides
編輯:這是一個過時的答案,不應該適用於Rails的4.x版+
你並不需要添加引用時,你可以使用一個整數ID到你引用的類。
我想說的是,使用引用而不是普通整數的好處在於,該模型將與belongs_to一起預定義,並且由於該模型已經創建,並且在遷移現有內容時不會受到影響,因此目的是丟失。
所以我會做這樣的代替:
rails g migration add_user_id_to_tester user_id:integer
,然後手動添加belongs_to的:用戶在測試模型
請注意,您將很可能需要對列的索引了。
class AddUserReferenceToTester < ActiveRecord::Migration
def change
add_column :testers, :user_id, :integer
add_index :testers, :user_id
end
end
當添加一列你需要做的是列一個整數,如果可能的話堅持使用Rails的慣例。所以對於你的情況,我假設你已經有一個測試人員和用戶模型,以及測試人員和用戶表。
要添加您需要創建一個名爲user_id的整數列外鍵(慣例):
add_column :tester, :user_id, :integer
然後一個belongs_to的添加到測試儀型號:
class Tester < ActiveRecord::Base
belongs_to :user
end
,你可能還希望爲外鍵添加索引(這是參考文獻已經爲您所做的):
add_index :tester, :user_id
通過上述兩個步驟,您仍然缺少外鍵約束。這應該工作:
class AddUserReferenceToTester < ActiveRecord::Migration
def change
add_column :testers, :user_id, :integer, references: :users
end
end
你可以到你的模型通過命令行通過以下方式添加引用:
rails g migration add_column_to_tester user_id:integer
這將生成一個遷移文件,如:
class AddColumnToTesters < ActiveRecord::Migration
def change
add_column :testers, :user_id, :integer
end
end
這工作正常我每次使用它..
你可以在變更遷移中使用引用。這是有效的Rails 3.2.13代碼:
class AddUserToTester < ActiveRecord::Migration
def change
change_table :testers do |t|
t.references :user, index: true
end
end
def down
change_table :testers do |t|
t.remove :user_id
end
end
end
CF:http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table
這將這樣的伎倆:
rails g migration add_user_to_tester user_id:integer:index
運行rails g migration AddUserRefToSponsors user:references
將產生以下遷移:
def change
add_reference :sponsors, :user, index: true
end
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
但是,這不會帶來支持它的數據庫中的相應的外鍵約束,對不對? – abahgat 2011-05-02 09:02:55
不,afaik Rails從不在數據庫上創建外鍵約束,除非你添加插件來爲你做。 – DanneManne 2011-05-03 02:44:42
剛剛學習這篇文章,請問我如何添加引用 – 2012-07-19 01:31:10