多字段的Ruby on Rails验证问题

时间:2012-06-19 12:09:24

标签: ruby-on-rails validation unique

我遇到了多个字段验证的问题,特别是区分大小写的唯一验证以及错误消息。

假设我想确保以下字段组合是唯一的,并且在我的[Postgres]数据库中区分大小写(Mary == mary):

user_id
first_name
last_name

作为一个例子 {4,Mary,Smith} {4,玛丽,史密斯} 不应该保存。

我知道我需要做两件事:
1.在db中创建唯一索引 2.我的模型中的validate_uniqueness_of

  1. 对于索引,我创建它虽然我没有找到一种方法来确保区分大小写(从我的阅读,似乎MySQL是Postgres不是)。除非有人知道如何做到这一点,否则我会考虑这样做。
  2. 我的模型中有以下代码:
  3.      
       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但不知道如何检查我的所有字段而不仅仅是一个字段。如何将所有字段添加到范围中并查看该范围是否为“:take”?


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

1 个答案:

答案 0 :(得分: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)

希望这有帮助!