3

我有一个Organization带有iv属性的模型。如果iv未设置,则它是随机的,但它必须是唯一的。首先想到的是下面的回调。它不像valid?尝试重新验证那样工作。

class Organization < ActiveRecord::Base
  validates :iv, uniqueness: true
  before_save :set_default_iv

  def set_default_iv
    self.iv ||= random(1000)

    ### is it possible to validate like this?
    # self.iv = random(1000) until valid?
 end
4

1 回答 1

5

按照建议使用 UUID 生成器,或使用某种算法自己检查唯一性(下面的示例)。但是在before_validation回调中执行此操作,因此验证器将捕获任何错误。

before_validation :set_default_iv

def set_default_iv
  self.iv = random(1000) until iv.present? && !collisions_exist?
end

def collisions_exist?
  class.where({:iv => iv}).
        where(new_record? ? {} : ['id != ?', id]).exists?
end

请注意,此算法的性能将随着表的增长和冲突的发生而降低。出于这个原因, UUID 生成器当然是推荐的方法random(1000),因为您根本不需要手动检查冲突。

于 2013-01-09T18:04:32.173 回答