1

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

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

user_id
first_name
last_name

例如
{4,Mary,Smith}
{4,mary,Smith}
不应该保存。

我知道我需要做 2 件事:
1. 在 db 中创建唯一索引
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,但它没有删除“用户”类。我发现了这个,但不知道如何让它检查我的所有字段而不仅仅是一个。如何将所有字段添加到范围中并查看该范围是否为“:taken”?


更新 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 回答