我想在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。
答案 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