通过迁移添加唯一约束不起作用

时间:2016-05-18 04:02:33

标签: ruby-on-rails ruby migration

我是一名使用rails api的新手ruby程序员。问题是api正在生产中,现在我想为模型中的一个列添加唯一约束。目前允许重复条目,我想使该列唯一。

所以我添加了两个具有相同名称的灯具:

two:
  name: MyString2
  location: 
  status: 2

three:
  name: MyString2
  location:
  status: 1 

然后我尝试运行这样的迁移:

class AddUniqueToLocationColumnName < ActiveRecord::Migration

  class User < ActiveRecord::Base
  end

  def self.up
    remove_index :locations, column: :name
    add_index :locations, :name, unique: true
  end

  def self.down
    remove_index :locations, column: :name # remove unique index
    add_index :locations, :name # adds just index, without unique
  end
end

但它显示错误:&#34;数据库中存在重复项。迁移失败。&#34; 同样是问题。我已经在生产表中有重复项了。我想为列&#34; name&#34;添加一个唯一约束。在表格#34;位置&#34; 。我怎样才能使这个专栏独一无二?

1 个答案:

答案 0 :(得分:0)

因此,您不希望位置模式中的任何两个条目有任何重复的名称,但重复项已经存在?你必须通过以下两种方法摆脱重复:

  1. 删除模型中的数据并从头开始

  2. 删除名称重复的个别地点

  3. 更改重复位置的名称。

  4. 所有这些都可以在rails / heroku控制台中轻松完成。

    此外,您可以将此代码添加到您的位置模型中:

    class Location < ActiveRecord::Base
       validates_presence_of :name
       validates_uniqueness_of :name
    end