Rails 3迁移: 添加引用列?

如果我创建一个新的 Rails 3迁移(例如)

rails g migration tester title:tester user:references

一切都很正常... 但是如果我加一个专栏,内容大致如下:

rails g migration add_user_to_tester user:references

参考字段无法识别。简而言之,问题是: 如何在从命令行迁移的 Rails 中添加引用列?

114848 次浏览

编辑 : 这是一个过时的答案,不应该应用于 < strong > Rails4.x +

如果可以对引用的类使用整数 id,则不需要添加引用。

我想说的是,使用引用而不是普通整数的好处是,模型将被预先定义为 properties _ to,而且因为模型已经创建,并且在迁移现有内容时不会受到影响,所以这种做法有点失败。

所以我会这样做:

rails g migration add_user_id_to_tester user_id:integer

然后在 Tester 模型中手动添加 properties _ to: user

请注意,您很可能也需要该列的索引。

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

然后向测试人员模型添加一个 properties _ 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 4. x,你现在可以使用引用生成迁移,像这样:

rails generate migration AddUserRefToProducts user:references

就像你在 导轨上看到的那样

可以通过以下方式通过命令行添加对模型的引用:

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

比对: 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

为 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

Helper 称为引用(也可以作为 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

将添加附件 _ id 列和默认值为 Photo的字符串 attachment_type列。

Http://guides.rubyonrails.org/v3.2.21/migrations.html#creating-a-standalone-migration