繁体   English   中英

保存记录前检查唯一值

[英]Check for unique value before saving record

我的设置:Rails 3.0.9、Ruby 1.9.2

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

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 基本上是取自这个 answer的一个 do-while 循环。 虽然没有测试,但我认为它应该工作。

如果您想在保存记录之前绝对确保 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

就个人而言,我认为我宁愿在数据库中的列上放置一个唯一约束,并在遇到真正的竞争条件时捕获产生的异常。

也许像......自我是新的 object

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

    else
     #You have unique key
    end
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM