Rails验证:仅N条记录可以为真

时间:2018-08-03 08:01:15

标签: ruby-on-rails ruby-on-rails-4 activerecord

您将如何编写验证以检查一定数量的记录是否已经具有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

就像上面的示例一样-我想确保将属性BlogPosts设置为onStartpage的三个true

但是它不起作用,因为当我要保存记录时,计数仍为2。由于计数过高,所有以后的更新都被拒绝。

1 个答案:

答案 0 :(得分:2)

问题是,即使您只是想更改标题,也要检查您以前的博客文章的验证。

仅当onStartPage属性已更改时,您才可以检查验证。

此外,您可以将条件更改为>=,就好像您已经拥有3个具有该属性的文章,严格来说3并不优于3 ...因此只有在您拥有4个文章之后,它才会返回false onStartpage设置为true。

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