ruby-on-rails – Rails – 从before_create返回false可防止更改其他模型

我有一个before_create过滤器,用于检查人们是否发布了太多评论.

如果他们是我想标记他们的帐户.

class Comment < ActiveRecord::Base
  before_create :check_rate_limit

  def check_rate_limit
    comments_in_last_minute = self.user.comments.count(:conditions => ["comments.created_at > ?", 1.minute.ago])
    if comments_in_last_minute > 2
      user.update_attribute :status, "suspended"
      return false
    end
    true
  end
end

before过滤器返回false以停止创建注释.问题是这会触发ROLLBACK,它也会撤消我对用户模型所做的更改.

完成此任务的正确模式是什么?具体来说:每次创建对象时运行检查,如果检查失败,则能够编辑另一个模型.

最佳答案 我认为速率限制的最佳方法是将请求排队并以最大允许速率读取它们.

标记过度使用的触发器简单地变为队列中的设定数量的请求.

它还具有不会立即影响您的数据库的优势,因为它允许在更好的可控排队系统中将数据库之前的瓶颈移动.这使得hte站点即使在“攻击”下也能保持响应.

这些队列可以像带有链表的hashmap一样简单.但如果可以使用,最好使用一些线程安全的fifo

点赞