如何在rails上的ruby中为表列添加唯一性

时间:2010-05-13 20:19:03

标签: mysql ruby-on-rails

我有一些包含一些列的表,现在我需要修改一列以使其唯一(没有重复值),我如何在ruby on rails上执行此操作?

5 个答案:

答案 0 :(得分:7)

您可以向模型添加验证以禁止重复值

class MyModel < ActiveRecord::Base
   validates_uniqueness_of :my_column_name
end

答案 1 :(得分:4)

class MyModel < ActiveRecord::Base
  validates_uniqueness_of :my_column_name
end
如果您在多个Heroku dynos上运行Unicorn,每个都有多个Web进程等,则上面提到的建议可能会中断。

所以更好的方法是

class AddEmailIndexToUser
  def change
    # If you already have non-unique index on email, you will need
    # to remove it before you're able to add the unique index.
    add_index :users, :email, unique: true
  end
end

https://robots.thoughtbot.com/the-perils-of-uniqueness-validations

或者您可以在迁移中使用原始sql来执行此操作。

execute <<-SQL
  ALTER TABLE Persons
  ADD UNIQUE (P_Id)
SQL

答案 2 :(得分:3)

这是直接来自我的工作项目的代码:

add_index( :tickets, [:to_email, :body_hash, :from_email] , :unique => true, :limit => 255)

注意只有在文本字段(而不是字符串)上使用unique时才需要 limit 功能,尽管它还没有在rails中实现(我相信3.0)。您可以使用mysql_index_length插件http://github.com/eparreno/mysql_index_length/

来解决此限制
add_index( :table_name, [:column_name, :second_column_name, :third_column_name] , :unique => true, :limit => 255)

此示例为三列创建唯一索引,但如果您愿意,可以将其用于一列。

链接到GitHub上的项目:http://github.com/thinkbohemian/WhySpam/blob/master/db/migrate/20091223193335_add_unique_index.rb

答案 3 :(得分:-1)

有人纠正我,如果我错了,因为我没有亲自使用过,但我相信你可以使用迁移来设置数据库级别的唯一性。

def self.up
    change_column :<table name>, :<attribute name>, :<data type>, :unique => true
end

答案 4 :(得分:-4)

 counter = 0
 Model.all.each {|m| m.some_value = counter; m.save; counter += 1;}

:)

然后将验证添加为@j。回答