如果我创建一个新的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