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

テーブルが大きくなり、衝突が発生しやすくなると、このアルゴリズムのパフォーマンスが低下することに注意してください。random(1000)UUID ジェネレーターは、この理由と、衝突を手動でチェックする必要がないため、確かに推奨されるアプローチです。

于 2013-01-09T18:04:32.173 に答える