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