RoR验证 - 条件被忽略?

时间:2015-01-22 16:07:59

标签: ruby-on-rails validation model

我正在尝试获取一个模型来验证列的唯一性当满足两个条件时 - 发布为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中指定条件时会失败?

1 个答案:

答案 0 :(得分:1)

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