4

我有一个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,它也会撤消我对用户模型所做的更改。

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

4

3 回答 3

2

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

标记过度使用的触发器只是成为队列中一组请求的数量。

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

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

于 2010-06-06T08:30:57.017 回答
0

这不是一个理想的答案,但现在即使帐户被暂停,我最终也只是返回 true。这种方式又经历了一个,但未来的没有。

于 2010-07-15T19:23:43.900 回答
0

对我来说,似乎在回调中返回 false 并不会停止返回记录,即使它没有保存到数据库中,这很奇怪。

于 2013-05-16T19:56:26.763 回答