rails g migration tester title:tester user:references
一切工作正常...但是如果我添加一个类似以下的列:
rails g migration add_user_to_tester user:references
引用字段未被识别。简而言之,问题是:如何通过命令行向Rails迁移添加引用列?
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指南上看到的那样
编辑:本回答已过时,不应用于Rails 4.x+
当你可以使用整数id引用类时,就不需要添加引用了。
我认为使用引用而不是普通整数的优点在于,该模型将预定义为belongs_to,并且由于该模型已经创建,当您迁移现有内容时,它将不受影响,因此其目的有些失去意义。
所以我会像这样做:
rails g migration add_user_id_to_tester user_id:integer
然后在Tester模型中手动添加belongs_to :user
add_foreign_key
方法,可以方便地在数据库级别上添加外键约束。 - Drewclass AddUserReferenceToTester < ActiveRecord::Migration
def change
add_column :testers, :user_id, :integer
add_index :testers, :user_id
end
end
rails g migration ...
生成了 add_reference :installs, :device, index: true
,它还会创建索引。 - B Seven在执行前两个步骤后,您仍然缺少外键约束。这将起作用:
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
参考: http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table
该链接提供了有关Rails ActiveRecord中change_table方法的文档。down
方法,我会遇到ActiveRecord::IrreversibleMigration
错误。我还必须将change
更改为up
。 - Andrew Grimm运行rails g migration AddUserRefToSponsors user:references
会生成以下迁移:
def change
add_reference :sponsors, :user, index: true
end
rails g migration add_user_to_tester user_id:integer:index
添加列时,需要将该列设为整数,并尽可能遵循Rails的约定。所以对于你的情况,我假设你已经有了Tester和User模型,以及testers和users表。
要添加外键,需要创建一个名为user_id(约定)的整数列:
add_column :tester, :user_id, :integer
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
在Rails 3中,帮助程序被称为references(也可作为belongs_to使用)。
此迁移将创建一个适当类型的category_id
列。请注意,您传递的是模型名称,而不是列名称。Active Record会自动添加_id
。
change_table :products do |t|
t.references :category
end
如果您有多态的belongs_to
关联,那么references将添加所需的两个列:
change_table :products do |t|
t.references :attachment, :polymorphic => {:default => 'Photo'}
end
attachment_type
列,并将默认值设置为 Photo
。
点击此处了解更多。rails g migration add_column_to_tester user_id:integer
class AddColumnToTesters < ActiveRecord::Migration
def change
add_column :testers, :user_id, :integer
end
end
每次我使用它时,它都可以正常工作。