hstore Postgres的自定义唯一性验证器

时间:2015-09-24 10:19:24

标签: ruby-on-rails postgresql validation hstore

我想在hstore字段上执行唯一性验证。

当我设置为:

class User
  store_accessor :attributes, :foo_attr
  validates :foo_attr, uniqueness: true
end

我得到undefined method 'limit' for nil:NilClass

在Rails问题store_accessor and uniqueness validation? 用户al2o3cr中解释:

  

validates_uniqueness_of在这种情况下不起作用 - 它是   期望一个名为stripe_id的数据库列。使用Hstore列   它在技术上可以执行所需的查询,但是   结果SQL仅适用于该存储格式并且仅适用   在Postgres上。

     

在您的情况下,自定义的子类   ActiveRecord :: Validations ::具有重写的UniquenessValidator   build_relation可能是更好的选择。

您将如何创建自定义验证器?

我已经按照Race condition using Postgres hstore中的说明设置了数据库级唯一性,我现在需要的是使其有效吗?在同一个foo_attr上返回false。

1 个答案:

答案 0 :(得分:2)

如果您遇到设置自定义hstore索引和编写自定义验证的麻烦,我的第一直觉是您可能希望foo_attr成为自己的列。

至于自定义验证,它非常简单:

validate :foo_attr_uniqueness

def foo_attr_uniqueness
  if self.class.where(foo_attr: foo_attr) # Same foo_attr
               .where.not(id: id)         # On a different record
               .exists?
    errors.add(:foo_attr, 'must be unique')
  end
end