RoR 验证——条件被忽略?

RoR validations -- conditions being ignored?

我正在尝试获取一个模型,以在满足两个条件时验证列的唯一性——已发布为真,弃用为假。如果其中任何一个相反,请不要保存模型。 现在,无论这些列的值如何,它似乎都在防止重复。

我有一个模型:

Article
-------
name:string
description:string
value:string
value_hash:string
published:bool
deprecated:bool

这是它的 class:

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中指定条件会失败?

您使用 before_save 回调计算了 checksum,因此在 运行 验证时您有 nil 校验和。使用 before_validate 回调