Rails迁移添加和删除引用

Mat*_*lly 43 ruby rails-migrations ruby-on-rails-3

创建迁移文件后,rails generate migration AddClientToUser我可以编辑我的迁移文件,如下所示:

class AddClientToUser < ActiveRecord::Migration
  def self.up
    change_table :users do |t|
      t.references :client
    end
  end

  def self.down
    change_table :users do |t|
      t.remove :client_id
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

这是反转迁移中添加的参考列的正确方法吗?

Dan*_*iel 36

这是对的!你也可以选择:

  def self.down
      remove_column :users, :client_id
  end
Run Code Online (Sandbox Code Playgroud)

  • 您现在还可以使用remove_references语法. (7认同)
  • @BinaryPhile:`remove_reference`(singular)而不是`remove_references` (3认同)

Mul*_*One 31

Rails 4.2.1

rails g migration RemoveClientFromUsers client:references
Run Code Online (Sandbox Code Playgroud)

会产生类似的迁移:

class RemoveClientFromUser < ActiveRecord::Migration
  def change
    remove_reference :users, :client, index: true, foreign_key: true
  end
end
Run Code Online (Sandbox Code Playgroud)

此外,通过添加以下内容,可以自由添加另一个或其他引用:

add_reference :users, :model_name, index: true, foreign_key: true
Run Code Online (Sandbox Code Playgroud)

在这个change方法中.最后rake db:migrate在保存对迁移的更改后运行,将产生所需的结果.

  • 也适用于 Rail 5.2 (3认同)
  • 在rails 5及以上版本中,你只需要`add_reference :users, :model_name`,索引就会默认添加 (2认同)

Rya*_*yan 23

在rails 4之后,您可以执行以下操作

class AddClientToUser < ActiveRecord::Migration
  def change
    add_reference :users, :client, index: true
  end
end
Run Code Online (Sandbox Code Playgroud)

它将为您处理up和down,以及创建外键索引.您也可以使用remove_reference相反的方法.