我的设置:Rails 3.0.9,Ruby 1.9.2保存记录前检查唯一值
我想在创建新记录之前为一列创建一个唯一的随机数。在Ruby中这样做最有效的方法是什么?我明白我可以使用validates_uniqueness_of,但我想事先确保唯一性。
我的设置:Rails 3.0.9,Ruby 1.9.2保存记录前检查唯一值
我想在创建新记录之前为一列创建一个唯一的随机数。在Ruby中这样做最有效的方法是什么?我明白我可以使用validates_uniqueness_of,但我想事先确保唯一性。
如果您希望在保存记录之前绝对保证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
个人而言,我想我宁愿放在列的唯一约束的数据库和赶上的情况下所产生的异常时,您会遇到一个真正的竞争条件。
关于锁定桌面的好建议,但正如你所说,这很重。把一个唯一的约束是一个合理的妥协,我猜会抛出一个唯一的索引约束。 – Bob
也许像... 自我是新对象
Object.currentkeys.each do currentkey
if self.key == current.key
#The key is allready in use
else
#You have unique key
end
end
怎么样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循环。 虽然没有测试,但我认为它应该工作。
不知道为什么你不希望数据库来处理这个问题。 – Dex
它可能有助于知道你在使用 – klochner
@Dex的号码是什么,原因是因为API是从多个设备和平台调用的,并且错误处理有问题,所以我宁愿不必返回错误。 – Bob