我正在尝试获取一个模型来验证列的唯一性当满足两个条件时 - 发布为true,不推荐使用为false。如果其中任何一个相反,请不要保存模型。 现在,无论这些列的值如何,它似乎都在阻止重复。
我有一个模特:
Article
-------
name:string
description:string
value:string
value_hash:string
published:bool
deprecated:bool
这是它的课程:
class Article < ActiveRecord::Base
belongs_to :user
validates_presence_of :name, :description, :value
validates_uniqueness_of :checksum, conditions: -> {where(published: true).where(deprecated: false)}, message: "already exists."
before_save :hash_article_value
def hash_article_value
self.checksum = Digest::SHA1.hexdigest(self.value)
end
end
所以,如果Joe保存了一篇文章,并且没有发布,那么Mike会保存同一篇文章并发布它,它应该允许Mike这样做。然后,Joe会尝试发布同一篇文章,但它会使唯一性约束失败。
问题: 现在,如果Joe保存了一篇未发表的文章,Mike就无法发布完全相同的文章(不符合唯一性约束)。
为什么我在validates_uniqueness_of中指定条件时会失败?
答案 0 :(得分:1)
您使用checksum
回调计算before_save
,因此在运行验证时您有nil
校验和。使用before_validate
回调