【问题标题】:Ruby on Rails Validation Issues for Multiple FieldsRuby on Rails 多个字段的验证问题
【发布时间】:2012-06-21 11:17:48
【问题描述】:

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

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

user_id
first_name
last_name

举个例子
{4,玛丽,史密斯}
{4,玛丽,史密斯}
不应该保存。

我知道我需要做两件事:
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,但它没有删除“用户”类。 我找到了this,但不知道如何让它检查我的所有字段而不仅仅是一个。如何将所有字段添加到范围中并查看该范围是否为 ":taken"?


2012 年 6 月 24 日更新 1:
使用我自己的验证方法听起来正是我所需要的,但我在实现代码时遇到了一些麻烦。 MyModel.find(:first) 方法已经被贬值了,所以我试着用这个代替它:

existing_record = ContactInfo.where(:conditions => ["first_name ILIKE ? AND last_name ILIKE ?", first_name, last_name]) 

但是当它到达下一行时 <pre>unless existing_record.blank? </pre>

我收到一个错误:

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

【问题讨论】:

    标签: ruby-on-rails validation unique


    【解决方案1】:

    您可以定义自己的验证方法来执行此操作。它可能看起来像:

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

    希望这会有所帮助!

    【讨论】:

    • 这正是我写的答案;-)
    • 我的错 - 查询不正确。当我将其重写为:existing_record = ContactInfo.where("contact_infos.first_name ILIKE ? AND contact_infos.last_name ILIKE ?", first_name, last_name) 时,它工作得很好。谢谢!
    猜你喜欢
    • 2016-08-04
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多