1

複数のフィールドの検証、特に大文字と小文字を区別する一意の検証とエラーメッセージで問題が発生しています。

次のフィールドの組み合わせが一意であり、[Postgres]データベースで大文字と小文字が区別される(Mary == mary)ことを確認したいとします。

user_id
first_name
last_name

例として、
{4、Mary、Smith}
{4、mary、Smith}
は保存しないでください。

私は2つのことをする必要があることを知っています:
1。データベースに一意のインデックスを作成します
2.モデルにvalidate_uniqueness_of

  1. インデックスについては、大文字と小文字を区別する方法を見つけられませんでしたが、作成しました(私の読書から、MySQLはPostgresではないようです)。誰かがこれを行う方法のアイデアを持っていない限り、私はこれが行われたと見なします。
  2. モデルに次のコードがあります。
     
   validates_uniqueness_of :user_id,
                :case_sensitive => false,
                :scope => [:first_name, :last_name],
                :if => :name_subcat_is_name?,
                :message => "You have already saved this contact information combination."

問題は、大文字と小文字の区別がuser_idにのみ適用され、姓名にも適用されないように見えることです。では、すべてのフィールドの検証に大文字と小文字を区別するにはどうすればよいですか?

また、私のエラーメッセージには、モデルの名前が含まれて います。

ユーザーこの連絡先情報の組み合わせは既に保存されています。

yamlを使用してみましたが、「User」クラスが削除されませんでした。これを見つけましが、1つだけではなく、すべてのフィールドをチェックする方法がわかりません。すべてのフィールドをスコープに追加して、そのスコープが「:taken」であるかどうかを確認するにはどうすればよいですか?


UPDATE 1 2012年6月24日:
独自の検証方法を使用することは、まさに私が必要としていることのように聞こえますが、コードの実装に問題があります。MyModel.find(:first)メソッドは減価償却されているので、次のように置き換えてみました。

existing_record = ContactInfo.where(:conditions => ["first_name ILIKE ? AND last_name ILIKE ?", first_name, last_name]) 

しかし、それが次の行に到達したとき

unless existing_record.blank? 

エラーが発生します:

PG::Error: ERROR:  column contact_infos.conditions does not exist
LINE 1: SELECT COUNT(*) FROM "contact_infos"  WHERE "contact_infos"....
SELECT COUNT(*) FROM "contact_infos"  WHERE "contact_infos"."conditions" IN ('first_name ILIKE ? AND last_name ILIKE ?', 'mary', 'Smith')
4

1 に答える 1

3

これを行うために、独自の検証方法を定義できます。次のようになります。

validate :user_id_uniqueness

def user_id_uniqueness
  return unless name_subcat_is_name?

  existing_record = MyModel.find(:first, :conditions => ["first_name ILIKE ? AND last_name ILIKE ?", first_name, last_name])
  unless existing_record.blank?
    errors.add(:user_id, "has already been saved in this contact information combination")
  end
end

(「ILIKE」はPostgresqlに固有です)

お役に立てれば!

于 2012-06-19T13:10:12.727 に答える