我有一些包含一些列的表,现在我需要修改一列以使其唯一(没有重复值),我如何在ruby on rails上执行此操作?
答案 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。回答