保存记录前检查唯一值

时间:2011-07-07 00:16:54

标签: ruby-on-rails

我的设置:Rails 3.0.9,Ruby 1.9.2

我想在创建新记录之前为列生成唯一的随机数。在Ruby中执行此操作的最有效方法是什么?我知道我可以使用validates_uniqueness_of但我想事先确保唯一性。

3 个答案:

答案 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