Rails验证:只有N条记录可以为真
Rails validation: Only N records can be true
您将如何编写验证来检查一定数量的记录是否已经具有 true
的属性?
class BlogPost
scope :onStartpage, -> { where(onStartpage: true) }
validate :number_on_startpage
def number_on_startpage
return unless onStartpage?
errors.add(:foobar, 'foo') if Blog::Post.where(onStartpage: true).count > 3
end
end
如上例所示 - 我想确保属性 onStartpage
设置为 true
的 BlogPosts
不超过三个
但它不起作用,因为当我想保存记录时,计数仍然是 2。所有以后的更新都被拒绝,因为计数太高。
问题是您的验证将检查以前的博客文章,即使您只是想更改标题。
只有 onStartPage 属性发生变化时,您才能检查验证。
此外,您可以将条件更改为 >=
,就好像您已经有 3 篇具有该属性的文章,3 并不严格优于 3...所以它只会 return false在将 onStartpage 设置为 true 的 4 篇文章之后。
class BlogPost
scope :onStartpage, -> { where(onStartpage: true) }
validate :number_on_startpage
def number_on_startpage
return unless onStartpage_changed?
errors.add(:foobar, 'foo') if Blog::Post.where(onStartpage: true).count >= 3
end
end
您将如何编写验证来检查一定数量的记录是否已经具有 true
的属性?
class BlogPost
scope :onStartpage, -> { where(onStartpage: true) }
validate :number_on_startpage
def number_on_startpage
return unless onStartpage?
errors.add(:foobar, 'foo') if Blog::Post.where(onStartpage: true).count > 3
end
end
如上例所示 - 我想确保属性 onStartpage
设置为 true
的 BlogPosts
不超过三个
但它不起作用,因为当我想保存记录时,计数仍然是 2。所有以后的更新都被拒绝,因为计数太高。
问题是您的验证将检查以前的博客文章,即使您只是想更改标题。
只有 onStartPage 属性发生变化时,您才能检查验证。
此外,您可以将条件更改为 >=
,就好像您已经有 3 篇具有该属性的文章,3 并不严格优于 3...所以它只会 return false在将 onStartpage 设置为 true 的 4 篇文章之后。
class BlogPost
scope :onStartpage, -> { where(onStartpage: true) }
validate :number_on_startpage
def number_on_startpage
return unless onStartpage_changed?
errors.add(:foobar, 'foo') if Blog::Post.where(onStartpage: true).count >= 3
end
end