【问题标题】:Rails validation: Only N records can be trueRails 验证:只有 N 条记录可以为真
【发布时间】:2018-08-03 16:50:40
【问题描述】:

您将如何编写一个验证来检查一定数量的记录是否已经具有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。并且所有以后的更新都会因为计数太高而被拒绝。

【问题讨论】:

  • @FabrizioBertoglio - 感谢您的回答!这不起作用,因为后来的更新会因为计数太高而失败。

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


【解决方案1】:

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

只有在属性 onStartPage 发生更改时,您才能检查您的验证。

另外,您可以将条件更改为>=,就好像您已经有3篇具有该属性的文章,3并不严格优于3...所以只有在您有4篇设置了onStartpage的文章后才会返回false为真。

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

【讨论】:

    猜你喜欢
    • 2013-11-03
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 2021-10-14
    • 2013-08-09
    相关资源
    最近更新 更多