2012-06-19 36 views
1

我在驗證多個字段時遇到了一些問題,特別是區分大小寫的唯一驗證以及錯誤消息。多個字段的Ruby on Rails驗證問題

比方說,我希望確保下面的字段組合是獨一無二的,是區分大小寫(瑪麗==瑪麗)在我的[Postgres裏的db:

user_id 
first_name 
last_name 

舉個例子
{4, Mary,Smith}
{4,mary,Smith}
不應該保存。

我知道我需要做兩件事情:
1分貝創建唯一索引
2.在我的模型

  1. 對於指數validate_uniqueness_of,我創造了它,雖然我沒有找到一個方法以確保區分大小寫(從我的閱讀,似乎是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」類。 我發現this,但不知道如何使它檢查我的所有領域,而不僅僅是一個。我如何將所有字段添加到作用域中,並查看該作用域是否「被採用」?


(更新版)2012年6月24日:
用我自己的驗證方法聽起來像是正是我需要的,但我有一些麻煩執行代碼。該MyModel.find(:第一)方法現在已經貶值,所以我想這個替代它:

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') 

回答

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特有的)

希望這有助於!

+0

這正是我正在寫作的答案;-) –

+0

請參閱我上面的評論.... – purplerice

+0

我的不好 - 查詢不正確。當我將它重寫爲:existing_record = ContactInfo.where(「contact_infos.first_name ILIKE?AND contact_infos.last_name ILIKE?」,first_name,last_name)時,它可以很好地工作。謝謝! – purplerice