2012-06-19 38 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