2011-07-07 82 views
0

我的设置:Rails 3.0.9,Ruby 1.9.2保存记录前检查唯一值

我想在创建新记录之前为一列创建一个唯一的随机数。在Ruby中这样做最有效的方法是什么?我明白我可以使用validates_uniqueness_of,但我想事先确保唯一性。

+1

不知道为什么你不希望数据库来处理这个问题。 – Dex

+0

它可能有助于知道你在使用 – klochner

+0

@Dex的号码是什么,原因是因为API是从多个设备和平台调用的,并且错误处理有问题,所以我宁愿不必返回错误。 – Bob

回答

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 

个人而言,我想我宁愿放在列的唯一约束的数据库和赶上的情况下所产生的异常时,您会遇到一个真正的竞争条件。

+0

关于锁定桌面的好建议,但正如你所说,这很重。把一个唯一的约束是一个合理的妥协,我猜会抛出一个唯一的索引约束。 – Bob

0

也许像... 自我是新对象

Object.currentkeys.each do currentkey 
    if self.key == current.key 
    #The key is allready in use 

    else 
    #You have unique key 
    end 
end 
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而基本上是从this answer采取do-while循环。 虽然没有测试,但我认为它应该工作。