Rails - возврат false из before_create предотвращает изменения в других моделях - PullRequest
4 голосов
/ 06 июня 2010

У меня есть фильтр 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, который также отменяет изменения, которые я внес в пользовательскую модель.

Какой правильный шаблон для этого? В частности: запуск проверки каждый раз при создании объекта и возможность редактирования другой модели в случае неудачной проверки.

Ответы [ 3 ]

2 голосов
/ 06 июня 2010

Я думаю, что лучший подход к ограничению скорости состоит в постановке запросов в очередь и чтении их с максимально допустимой скоростью.

Триггер для пометки злоупотребления просто становится заданным числом запросов в очереди.

Он также имеет преимущество, заключающееся в том, что он не оказывает немедленного воздействия на вашу базу данных, поскольку позволяет устранить узкое место перед базой данных в более управляемой системе очередей. Это позволяет сайту оставаться отзывчивым даже при «атаке».

Эти очереди могут быть простыми, как хеш-карта со связанным списком. Но лучше использовать некоторые threadsafe fifo, если доступно

0 голосов
/ 16 мая 2013

для меня кажется, что возвращение false в обратном вызове не прекращает возвращать запись, даже если она не сохраняется в базе данных, странно.

0 голосов
/ 15 июля 2010

Это не идеальный ответ, но сейчас я просто вернул истину, даже если учетная запись была приостановлена. Так прошел еще один, а в будущем нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...