我在验证多个字段时遇到了一些问题,特别是区分大小写的唯一验证以及错误消息。
假设我想确保以下字段组合在我的 [Postgres] 数据库中是唯一的并且区分大小写(Mary == mary):
user_id
first_name
last_name
例如
{4,Mary,Smith}
{4,mary,Smith}
不应该保存。
我知道我需要做 2 件事:
1. 在 db 中创建唯一索引
2. 在我的模型中 validate_uniqueness_of
- 对于索引,我创建了它,尽管我没有找到确保区分大小写的方法(从我的阅读来看,似乎 MySQL 是,而 Postgres 不是)。除非有人知道如何做到这一点,否则我会考虑这样做。
- 我的模型中有以下代码:
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')