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 设置为 trueBlogPosts 不超过三个

但它不起作用,因为当我想保存记录时,计数仍然是 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