0

レコードがすでに存在するかどうかを確認するために仮想フィールドで検証を実行する必要があるRails3アプリに取り組んでいます...これが私のモデルコードです:

      #mass-assignment
      attr_accessible :first_name, :last_name, :dob, :gender

      #validations
      validates_presence_of :first_name, :last_name, :gender, :dob
      validates :fullname, :uniqueness => { :scope => [:dob] }

def fullname
    "#{first_name} #{last_name}"
  end

エラーは発生していません。検証に合格しています。

4

1 に答える 1

1

私はあなたが標準でそのようなことをすることができるとは思わないvalidates。理由は、通常、一意性の「単純な」SQLルックアップです。ただし、メソッドから返されるものの一意性を確認するには、次のことを行う必要があります。

  • スコープのすべてのエントリを取得します
  • それぞれについて、メソッドを実行しfullnameます。
  • 一意性をテストしながら、すべての結果を配列に追加します

データセットが小さい場合は単純ですが、スコープ内で10K以上の一致に達するとすぐに、実行するのに何年もかかります。

私は個人的にdobスコープを使用して標準のbefore_saveでこれを行います

before_save :check_full_name_uniqueness

def check_full_name_uniqueness
  query_id = id || 0
  return !Patient.where("first_name = ? and last_name = ? and dob = ? and id != ?", first_name, last_name, dob, query_id).exists?
end

エラーメッセージを追加(戻る前):

errors.add(:fullname, 'Your error')

コントローラに戻って、エラーを取得します:

your_object.errors.each do |k, v| #k is the key of the hash, here fullname, and v the error message
  #Do whatever you have to do
end
于 2012-07-31T01:47:44.483 に答える