Как сделать новостную ленту без множества заявлений на присоединение - PullRequest
3 голосов
/ 15 февраля 2012

Как лучше всего подходить к созданию новостной ленты?

В настоящее время у меня есть наблюдатель, который создает новую запись активности новостей каждый раз, когда кто-то создает запись.Но, чтобы справиться с конфиденциальностью, я получаю 7 или 8 соединений, чтобы получить соответствующий результат.

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


Подробнее:

В настоящее время у меня есть сайт, который помогает пользователям отслеживать проекты, над которыми они работают.Существуют публичные и частные проекты (куда люди могут приглашать соавторов).

Я хочу, чтобы моя лента новостей включалась при создании публичных проектов.Когда вас приглашают в частный проект.Когда пользователь следует за проектом.И затем все действия других пользователей, за которыми вы следите.Затем для частных проектов у меня есть еще одна таблица соединений, чтобы определить, кто имеет доступ к проектам.(Также есть комментарии к каждому из этих проектов, которые я хочу показать в новостной ленте).

Все следующие отношения в настоящее время находятся в таблицах соединений, поэтому у меня много объединений.

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

SELECT news_feed_activities. * FROM news_feed_activities LEFT JOIN user_following_relationships ON user_following_relationships .following_id = news_feed_activities .user_id LEFT JOIN user_project_relationships ON user_project_relationships .project_id = news_feed_activities .responding_to_id AND news_feed_activities .responding_to_type = 'Project' ГДЕ (user_following_relationships .user_id = 1 ИЛИuser_project_relationships .user_id = 1 ИЛИ news_feed_activities .user_id = 1 ИЛИ up2 .user_id = 1) GROUP BY news_feed_activities .id ORDER BY news_feed_activities .id DESC


РЕДАКТИРОВАТЬ: Я думаю, что я, вероятно, в конечном итоге использовать Redis по этим направлениям http://blog.waxman.me/how-to-build-a-fast-news-feed-in-redis

1 Ответ

0 голосов
/ 16 февраля 2012

Как RoR.

В вашем контроллере:

@user = current_user # (?)
recent_since = 24.hours.ago
@news_feed = []

# 1) I want my newsfeed to include when public projects are created. 
@news_feed += Project.recent.open
# 2) When you are invited to a private project. 
@news_feed += @user.invites.received.pending
# 3) When a user follows a project.
@news_feed += @user.user_following_relationships.recent
# 4) And then all of the actions of the other users that you're following. 
@news_feed += @user.follows.collect(&:activities)
# 5) Then for the private projects I have another join table to determine who has access to the projects. (There are also comments on each of these projects that I want to show up in the newsfeed as well).
@news_feed += @user.projects.closed

@news_feed.sort!{ |a,b| a.created_at <=> b.created_at }

Я также сделал несколько примеров областей для вас.project.rb

scope :recent, :conditions => ["created_at >= ?", 24.hours.ago]
scope :open, :conditions => "publicity = 'Public'"
scope :closed, :conditions => "publicity = 'Private'"

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

...