Rails 3迁移:添加引用列?

Pla*_*Ton 162 migration activerecord ruby-on-rails

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

rails g migration tester title:tester user:references
Run Code Online (Sandbox Code Playgroud)

,一切正常......但是,如果我添加一个包含以下内容的列:

rails g migration add_user_to_tester user:references
Run Code Online (Sandbox Code Playgroud)

参考字段无法识别.简而言之,问题是:如何从命令行向rails迁移添加引用列?

Pau*_*lgo 205

如果您使用的是Rails 4.x,现在可以使用引用生成迁移,如下所示:

rails generate migration AddUserRefToProducts user:references
Run Code Online (Sandbox Code Playgroud)

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

  • 如何为外键指定列名而不是自动生成的名称? (2认同)

Dan*_*nne 186

编辑:这是一个过时的答案,不应该应用于Rails 4.x +

如果可以对引用的类使用整数id,则无需添加引用.

我说使用引用而不是普通整数的优点是模型将使用belongs_to预定义,并且由于模型已经创建,并且在迁移现有内容时不会受到影响,因此目的有点丢失.

所以我会这样做:

rails g migration add_user_id_to_tester user_id:integer
Run Code Online (Sandbox Code Playgroud)

然后在Tester模型中手动添加belongs_to:user

  • 不,afaik Rails永远不会在数据库上创建外键约束,除非您添加插件来为您执行此操作. (19认同)
  • 记得用user:integer:index添加索引 (13认同)
  • 但这不会对支持它的数据库产生适当的外键约束,对吗? (9认同)
  • 答案已过时,请参阅@Paulo对现代铁轨的回答. (3认同)

Eug*_*ene 102

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

class AddUserReferenceToTester < ActiveRecord::Migration
  def change
    add_column :testers, :user_id, :integer
    add_index  :testers, :user_id
  end
end
Run Code Online (Sandbox Code Playgroud)


小智 50

通过上面提到的前两个步骤,您仍然缺少外键约束.这应该工作:

  class AddUserReferenceToTester < ActiveRecord::Migration
      def change
          add_column :testers, :user_id, :integer, references: :users
      end
  end
Run Code Online (Sandbox Code Playgroud)


gl0*_*l03 35

可以在更改迁移中使用引用.这是有效的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
Run Code Online (Sandbox Code Playgroud)

cf:http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table


Wir*_*ing 27

运行rails g migration AddUserRefToSponsors user:references将生成以下迁移:

def change
  add_reference :sponsors, :user, index: true
end
Run Code Online (Sandbox Code Playgroud)


Zam*_*ith 8

添加列时,需要将该列设为整数,如果可能,请使用rails约定.因此,对于您的情况,我假设您已经拥有测试人员和用户模型,以及测试人员和用户表.

要添加外键,需要创建名为user_id(约定)的整数列:

add_column :tester, :user_id, :integer
Run Code Online (Sandbox Code Playgroud)

然后将belongs_to添加到测试器模型:

class Tester < ActiveRecord::Base
  belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

您可能还想为外键添加索引(这是引用已经为您做的事情):

add_index :tester, :user_id
Run Code Online (Sandbox Code Playgroud)


mas*_*ily 8

这样就可以了:

rails g migration add_user_to_tester user_id:integer:index
Run Code Online (Sandbox Code Playgroud)