rails 中的 Alter ignore table 的等价物是什么

What is the equivalent of Alter ignore table in rails

我有一个为 habtm 关系创建的连接 table。早些时候我为 table 创建了一个索引,但后来我想将唯一的 true 属性添加到索引中,我为此编写了一个新的迁移,它应该删除旧索引并创建新索引。但问题是我的数据库已经包含一些重复值,在 mysql 我们有办法使用 改变忽略 table。作为:

ALTER IGNORE TABLE pst_nw ADD UNIQUE INDEX (add1, add2, add3, add4);

它在 rails 中的等价物是什么?我们如何通过迁移指定忽略标志?

我认为 rails 中没有直接相当于 ALTER IGNORE TABLE 功能的单行代码。

将功能分成两部分可能是个好主意:

  1. 删除重复数据
  2. 添加唯一索引

第一个任务可以通过 运行 完成 ALTER IGNORE TABLE .. ADD UNIQUE INDEX.. 步骤,然后是 DROP INDEX 步骤作为脚本的一部分(rake 任务 / 单独的脚本 / 运行 直接在 mysql 中查询),只需 运行 一次。

第二个将是一个简单的 add_index 迁移。

我的方法是 运行 使用 execute 的原始 ALTER IGNORE SQL 查询,然后删除该索引并将其重新添加到 "Rails way"我的模式的一致性:

class AddUniqueIndexesToPstNw < ActiveRecord::Migration
  def up
    execute "ALTER IGNORE TABLE `pst_nw` ADD UNIQUE INDEX `drop_me` (add1, add2, add3, add4)"
    remove_index :pst_nw, :drop_me
    add_index :pst_nw, [:add1, :add2, :add3, :add4], unique: true
  end

  def down
    remove_index :pst_nw, [:add1, :add2, :add3, :add4]
  end
end