如何在不区分大小写的情况下验证唯一对

时间:2014-12-22 16:34:01

标签: ruby-on-rails validation unique case-insensitive

我有一个公会模特,有一个"姓名"和#34;境界"属性 我想让它成为" Name"和#34;境界"无论如何,配对都是独一无二的。强制执行区分大小写是我遇到的唯一问题。

这是我到目前为止所得到的:

validates_uniqueness_of :name, scope: :realm, case_sensitive: false

[case_sensitive:false]部分有效但仅适用于第一个属性(名称)

我目前正在使用Rails 4.1.8,SQLite for developemnt和PG for Production 我非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

我的理解是不支持此功能。 case_sensitive选项适用于要验证的列,范围选项仅适用于同一表中的列。

您可以尝试使用PG lower,因此scope: "lower(realm)",但我怀疑它在尝试访问列table_name.lower(realm)时会失败

您需要做的是将该验证器替换为自定义验证器。

class Model
  validate :your_validator

  private

  def your_validator
    if Model.
       where("LOWER(name) = ? AND LOWER(realm) = ?",
             name.downcase, realm.downcase).
       exists?
      # add errors here
    end
  end
end