我有一个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 filter返回false以停止创建注释。问题是这会触发ROLLBACK,这也会撤消我对用户模型所做的更改。
完成此任务的正确模式是什么?具体来说:每次创建对象时都运行检查,如果检查失败,则能够编辑另一个模型。
答案 0 :(得分:2)
我认为速率限制的最佳方法是将请求排队并以最大允许速率读取它们。
标记过度使用的触发器简单地成为队列中的一组请求。
它还具有不会立即影响您的数据库的优势,因为它允许在更好的可控排队系统中将数据库之前的瓶颈移动。这使得hte站点即使在“攻击”下也能保持响应。
这些队列可以像带有链表的hashmap一样简单。但如果可以使用,最好使用一些线程安全的fifo
答案 1 :(得分:0)
这不是一个理想的答案,但就目前而言,即使帐户被暂停,我最终也会返回true。这样一来就有了,但未来却没有。
答案 2 :(得分:0)
对我来说,似乎在回调中返回false并不会停止返回记录,即使它没有保存到数据库中,也很奇怪。