2016-05-18 54 views
0

我是一名在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 

但其示值误差:“重复存在于数据库。迁移失败。“ 同样是问题。我已经在生产表中有重复。我想为表“位置”中的列“名称”添加一个唯一的约束。我如何使这个专栏独一无二?

+0

它是b'co​​z重复的记录存在于数据库,首先,从DB中删除重复记录,然后尝试运行。 – Amit

+0

我想通过迁移将其删除。通过一个红宝石代码找到所有重复项并销毁它们 – Abhishek

回答

0

因此,您不希望您的位置模式中的任何两个条目有任何重复的名称,但重复项已存在?你将不得不通过任何摆脱重复的:

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

  2. 删除具有重复名称

  3. 改变个别位置重复位置的名称。

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

此外,您还可以添加此代码到你的位置型号:

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

1.我无法从零开始,因为它在生产中。 2.个人删除很麻烦,因为有很多重复。 3.名称不能更改。是否有任何其他方式在迁移本身中编写几行代码,以便可以删除重复项并添加唯一约束? – Abhishek