我的设置:Rails 3.0.9,Ruby 1.9.2
我想在创建新记录之前为列生成唯一的随机数。在Ruby中执行此操作的最有效方法是什么?我知道我可以使用validates_uniqueness_of但我想事先确保唯一性。
答案 0 :(得分:2)
before_create或before_save AR回调怎么样?
类似的东西:
class ModelNameHere < ActiveRecord::Base
before_create :generate_unique_number
private
def generate_unique_number
begin
self.number = unique_number_generator()
end while (not ModelNameHere.find_by_number(self.number).blank?)
end
begin..end while基本上是从this answer获取的do-while循环。 虽然Haven没有经过测试,但我认为它应该可行。
答案 1 :(得分:1)
如果要在保存记录之前绝对确保Ruby的唯一性,请将其包装在事务中并锁定表。请注意,这可能会对您的表现产生重大影响。
self.class.transaction do
connection.execute('LOCK TABLES table_name WRITE')
# do your random generation until uniqueness validation passes here
connection.execute('UNLOCK TABLES')
end
就我个人而言,我认为我宁愿在数据库中的列上放置一个唯一约束,并在遇到真正的竞争条件时捕获结果异常。
答案 2 :(得分:0)
也许像...... 自我是新对象
Object.currentkeys.each do currentkey
if self.key == current.key
#The key is allready in use
else
#You have unique key
end
end