Answers:
如果您使用的是Rails 4.x,现在可以使用引用生成迁移,如下所示:
rails generate migration AddUserRefToProducts user:references
就像在导轨上看到的一样
编辑:这是一个过时的答案,不应应用于Rails 4.x +
可以在引用的类中使用整数id时,无需添加引用。
我要说的是,使用引用而不是普通整数的优势在于,该模型将使用belongs_to进行预定义,并且由于该模型已经创建,并且在迁移现有内容时不会受到影响,因此目的就有些丢失了。
因此,我想这样做:
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
user.testers
,则可以省略索引。
rails g migration ...
产生add_reference :installs, :device, index: true
,其还创建索引。
通过上述前面的两个步骤,您仍然缺少外键约束。这应该工作:
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
down
方法,则ActiveRecord::IrreversibleMigration
在使用Rails 3.2回滚时会遇到。我还必须更改change
为up
。
运行rails g migration AddUserRefToSponsors user:references
将生成以下迁移:
def change
add_reference :sponsors, :user, index: true
end
添加列时,您需要将该列设置为整数,并尽可能遵循rails约定。因此,对于您的情况,我假设您已经有一个Tester和User模型,以及testers和users表。
要添加外键,您需要创建一个名称为user_id(约定)的整数列:
add_column :tester, :user_id, :integer
然后向测试器模型添加一个belongs_to:
class Tester < ActiveRecord::Base
belongs_to :user
end
并且您可能还想为外键添加索引(这是引用已经为您完成的操作):
add_index :tester, :user_id
对于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
对于Rails 3
帮助程序称为引用(也可以作为参考belongs_to
)。
此迁移将创建category_id
适当类型的列。请注意,您传递的是模型名称,而不是列名称。Active Record _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列和attachment_type
一个默认值为的字符串列Photo
。
http://guides.rubyonrails.org/v3.2.21/migrations.html#creating-a-standalone-migration