Rails 3迁移:添加引用列?
如果我创build一个新的轨道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 4.x +
当您可以使用整数id到您引用的类时,不需要添加引用。
我会说使用引用而不是普通的整数的好处是模型将与belongs_to预定义,因为模型已经创build,并且不会影响你迁移现有的东西时,目的是失去了一种。
所以我会这样做,而不是:
rails g migration add_user_id_to_tester user_id:integer
然后在Tester模型中手动添加belongs_to:user
请注意,您很可能也需要在该列上的索引。
class AddUserReferenceToTester < ActiveRecord::Migration def change add_column :testers, :user_id, :integer add_index :testers, :user_id end end
通过上述两个步骤,您仍然缺less外键约束。 这应该工作:
class AddUserReferenceToTester < ActiveRecord::Migration def change add_column :testers, :user_id, :integer, references: :users 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 AddUserRefToSponsors user:references
将生成以下迁移:
def change add_reference :sponsors, :user, index: true end
添加列时,需要将该列设置为整数,如果可能,请使用导轨约定。 所以对于你的情况,我假设你已经有一个testing和用户模型,testing人员和用户表。
要添加外键,您需要创build一个名称为user_id(约定)的整数列:
add_column :tester, :user_id, :integer
然后将belongs_to添加到testing仪模型中:
class Tester < ActiveRecord::Base belongs_to :user end
你也可能想为外键添加索引(这是引用已经为你做的):
add_index :tester, :user_id
这将做的伎俩:
rails g migration add_user_to_tester user_id:integer:index
您可以通过以下方式通过命令行添加对模型的引用:
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 4
生成器接受列types作为引用(也可以作为belongs_to
)。
此迁移将创build一个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
对于Rails 3
助手被称为引用(也可以作为belongs_to
)。
此迁移将创build适当types的category_id
列。 请注意,您传递模型名称,而不是列名称。 活动logging为您添加_id
。
change_table :products do |t| t.references :category end
如果你有多态的belongs_to
关联,那么引用将添加两个所需的列:
change_table :products do |t| t.references :attachment, :polymorphic => {:default => 'Photo'} end
将添加一个attachment_id列和一个默认值为Photo
的stringattachment_type
列。
http://guides.rubyonrails.org/v3.2.21/migrations.html#creating-a-standalone-migration