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