我有一个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