Отслеживание «новых» элементов (сообщений, комментариев, электронных писем ...) в базе данных - Ruby on Rails - PullRequest
1 голос
/ 03 августа 2009

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

В данный момент я просто сообщаю количество «новых сообщений» примерно так:

Post.find(:all, :conditions => [ "updated_at > ?", session[:user_last_login]]).length

Очевидно, что это отчасти хорошо.

Прежде чем я начну портить все мое приложение, есть ли самый простой способ, которым я могу добиться того, что я описал, и есть ли у rails какие-то кусочки, чтобы помочь мне?

Кроме того, есть ли общее название для такого рода функций, которые могут помочь моему поиску в Google?

Спасибо.

Ответы [ 5 ]

2 голосов
/ 03 августа 2009

Довольно типичным подходом к этому является отслеживание того, когда пользователь последний раз просматривал конкретный объект (или коллекцию объектов). Затем, если у вас есть created_at или updated_at на объектах, которые вы хотите отслеживать просмотры, вы можете подсчитать количество, скажем, постов, которые изменились с момента последнего просмотра пользователем новости. *

Итак, у вас может быть такой класс:

class NewsItemTrack < ActiveRecord::Base

  belongs_to :news_item
  belongs_to :user

  def self.track(news_item_id, user_id)
    nt = self.find_by_news_item_id_and_user_id(news_item_id, user_id)
    if nt.nil?
      nt = self.create(:news_item_id => news_item_id, :user_id => user_id, :last_viewed_at => Time.now)
    else
      nt.update_attribute(:last_viewed_at, Time.now)    
    end
  end

  def new_comment_count
    Comment.count(:all, :conditions => ['news_item_id = ? and created_at > ?', self.news_item_id, self.last_viewed_at]
  end
end

Где NewsItemTrack.track будет записывать тот факт, что пользователь просмотрел новость, о которой идет речь. Затем, когда вы хотите узнать, сколько новых комментариев к новостному элементу вы сделаете:

NewsItemTrack.find_by_news_item_id_and_user_id(123, 456).new_comment_count
1 голос
/ 03 августа 2009

Вы можете взглянуть на ActsAsReadable , автор Michael Bleigh

1 голос
/ 03 августа 2009

Я бы использовал таблицу соединений с полиморфными отношениями - используя плагин (gem?) Has_many_polymorphs.

У вас может быть объединенная таблица, называемая «просмотры», и связанная модель просмотра. h_m_p предоставит вам такие методы, как «views_posts», «Просмотренные_комментарии», «Просмотренные_новости» и т. д. («Новости» - это плохое имя модели, оно должно быть в единственном числе, например «NewsItem» с таблицей «news_items» или чем-то похожим).

Google has_many_polymorphs для главной страницы, есть примеры и прочее.

0 голосов
/ 03 августа 2009

Именно то, что сказал tvanfosson . Потому что ваш пример потерпит неудачу, когда пользователь входит в систему, но не не просматривает непрочитанные сообщения.

Установите значение по умолчанию для сообщения new и установите его на viewed при первом отображении. В Ruby on Rails первым рендером обычно будет действие show.

0 голосов
/ 03 августа 2009

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

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