Rails - Лента новостей - PullRequest
       2

Rails - Лента новостей

0 голосов
/ 30 октября 2010

Хорошо, вот самый сложный вопрос, который мне когда-либо приходилось задавать в StackOverflow.

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

Тем временем я хочу, чтобы новостная лента позволяла пользователям узнать, чем занимаются друзья.Поэтому я создал модель наблюдателя, которая after_create создает элемент типа news_feed.

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

Итак, я хочу сделать так, чтобы новостная лента для этой модели вводилась только за сеанс или каждые X минут.Поэтому я добавил в модель столбец last_feeded_at.

Проблема в том, что когда я пытаюсь обновить это поле в наблюдателе, чтобы отметить, что оно было передано, это вызывает наблюдателя, что приводит к беспорядку во всем.

Какой лучший способ справиться с этим?Я открыт для всех умных предложений.

Спасибо

Ответы [ 3 ]

2 голосов
/ 30 октября 2010

Я бы не добавил к вам атрибут модели документа для этого.Возможно, у вас уже есть что-то вроде этого:

class Document
  has_many :news_feeds, :order => 'created_at DESC'
end

В вашем обратном вызове (в модели документа) просто проверьте, когда была создана последняя новостная лента:

after_save :create_news_feed, :if => Proc.new { |doc| doc.news_feeds.first.created_at <= 10.minutes.ago }

Это вызовет только create_news_feed если последний канал новостей был создан не менее 10 минут назад.

1 голос
/ 30 октября 2010

Я предполагаю, что когда пользователь заканчивает редактирование, он выполняет окончательное сохранение?Определите attr_accessor, draft, который отправляется как параметр из контроллера при обработке request.js ajax save.Я не вижу потребности в наблюдателе на самом деле;просто поместите это в модель.

attr_accessor :draft
after_save :log_unless_draft

def log_unless_draft
  unless draft.eql?(true)
    log_event.new(...

Кстати, я не понимаю, почему after_create даже срабатывает, учитывая, что это не new_record после первого сохранения.

0 голосов
/ 30 октября 2010

Я бы создал ваш объект NewsFeed, используя такую ​​логику

def find_or_create_feed
  if session[:news_feed].nil?
    NewsFeed.new
  else
    NewsFeed.find(session[:news_feed])
  end
end

Таким образом, вы можете вернуть один и тот же объект NewsFeed для всего сеанса. Если вы хотите получить фантазию и истечь срок ее действия, периодически выполняйте сканирование таблицы news_feeds, чтобы удалять каналы старше определенного возраста.

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