2012-06-03 1 views
3

В приложении Rails я хочу объединить несколько моделей в один поток активности.Как создать (высокую производительность) фид активности от нескольких моделей?

Например, у меня есть сообщение, комментарий, фото, статусные модели. Каждый из них принадлежит Пользователю, Учреждению и Городу. На странице User/Institution/City show я хочу отобразить хронологический список последних действий.

Из-за того, что вы читаете вокруг и из других вопросов о SO, на это, похоже, есть две школы мысли.

  1. Создайте полиморфную модель ActivityFeed, где, например, a Пользователь has_many :posts as: feedable. Затем визуализируйте коллекцию ActivityFeed на соответствующих отображаемых страницах.
  2. Создайте и визуализируйте объединенный массив, например. @user_feed = @user_photos + @user_comment +..

Но я не видел много дискуссий о плюсах и минусах каждого подхода.

Неужели кто-то еще попытался что-то подобное? Какие вопросы я должен думать или планировать при выборе подхода? Насколько хорошо каждый из них выполняется (особенно по мере увеличения базы данных)?

Мои требования:

  1. Чтобы отобразить все элементы, которые принадлежат к родительской модели.
  2. Чтобы иметь несколько разных типов родительской модели (Пользователь, Учреждение, Город и т. Д.).
  3. Для отображения отдельного элемента для каждого элемента в фиде активности, в зависимости от его класса.

Благодарен за любые мысли, личные впечатления или указатели на дополнительную информацию об этом. Должен ли я искать третий вариант? Меня особенно интересует производительность создания объединенного массива из нескольких запросов.

Благодаря

+0

у вас есть ожидаемый запрос каждого второго типа цели в уме? – Blankman

ответ

3

Позволь мне добавить несколько вопросов к вашим требованиям

  1. простоты отображения всех элементам, принадлежащим к родительской модели
  2. легкости позволяет для различных типов родительской модели
  3. легкости рендеринга шаблонов, зависящих от класса классов.
  4. легкость рефакторинга функций общего доступа
  5. легкость интеграции функций управления потенциальной активностью (пометить как прочитанные, подписаться, следовать, поделиться и т. Д.)
  6. легкость расчета полиморфного питания, скажем, в обратном хронологическом порядке деятельности различных типов.
  7. простоты расчета агрегированного подсчета активности на родителях

Для меня 5 и 6 и 7 советов Дефо его в пользу первого варианта, мой код будет:

class Activity 
    belongs_to :activity, polymorphic: true 
    belongs_to :user, counter_cache: true 
    belongs_to :institution, counter_cache: true 
    belongs_to :city, counter_cache: true 
end 

своих возможностей для город новостная лента (демонстрируя 1,2,6)

city.activities.order('updated_at DESC').limit(20) 

отмечают, что это дешевый поиск на одном столе только что уже может дать вам достаточно быстрый список, так как Asso загрузка ciation (будет .includes(:activities)) не требуется для отображения чего-то вроде.

Joe from NYU, New York has posted a comment 
Mel from UCL, London has added a new photo 

4 является тривиальным, если деятельность представляет собой отдельный класс и 5 также гладкие со стандартным контроллером активности. для общих частей рендеринга, таких как просмотры/действия быстрого просмотра, будет естественным местом. 7 легко выполняется с помощью counter_cache. в качестве бонуса, позволяя HAS_MANY: деятельность по каждому типу, можно различать виды деятельности, как создание, обновление, читать и т.д.

надеюсь, что это помогает

+0

спасибо viktor, отличный ответ. Я определенно рассматриваю модель деятельности очень сильно. Но я опасаюсь следующего вопроса. Лучший способ сделать модель Activity - это переместить user_id, city_id, instit_id из модели контента (комментарий, сообщение и т. Д.) И на модель действия, правильно? Этот дизайн базы данных делает меня неудобным. Собственность является неотъемлемой частью записи post/photo/etc и должна быть на этой модели. Что вы думаете об этом? –

+0

Я бы по-прежнему сохранял 3 принадлежащих к ним в моделях контента и просто реплицировал их в обратном вызове, который добавляет активность в контент. Это дублирование для оптимизации в вашей простой настройке, но если у вас есть сложная модель деятельности, ассоциации могут быть даже развязаны (Joe hearts Mel's photo :) –

+0

спасибо. можете ли вы порекомендовать какие-либо хорошие примеры или информацию об этом? –

Смежные вопросы