Создание ленты новостей в Rails 3 - PullRequest
5 голосов
/ 14 июня 2011

Я хочу создать ленту активности из недавней статьи и комментариев в моем приложении rails. Это два разных типа активных записей (их структура таблиц различна).

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

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

Есть ли способ создать область видимости, которая создаст смешанный массив?

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

Есть идеи, как это решить?

Ответы [ 2 ]

7 голосов
/ 14 июня 2011

Когда я сделал это раньше , я справился с этим с помощью денормализованной модели UserActivity или аналогичной с belongs_to полиморфной ассоциацией с ActivitySource - который может быть любым изтипы контента, который вы хотите отобразить (посты, комментарии, количество голосов, лайки и т. д.).

Затем, когда создается любой из отображаемых объектов, у вас появляется Observer, который запускаетсяи создает строку в таблице UserActivity со ссылкой на запись.

Затем, чтобы отобразить список, вы просто запрашиваете UserActivity упорядочение по created_at по убыванию, а затем перемещаетесь по полиморфному activity_source ассоциация для получения данных контента.Тогда вам понадобятся некоторые смарты в ваших шаблонах представления, чтобы отображать комментарии и сообщения и что-то еще иначе.

Например, что-то вроде ...

user_activity.rb:

class UserActivity < ActiveRecord::Base
  belongs_to :activity_source, :polymorphic => true

  # awesomeness continues here...
end

comment.rb (пост / что угодно)

class Comment < ActiveRecord::Base
  # comment awesomeness here...
end

activity_source_observer.rb

class ActivitySourceObserver < ActiveRecord::Observer

  observe :comment, :post

  def after_create(activity_source)
    UserActivity.create!(
      :user => activity_source.user, 
      :activity_source_id => activity_source.id, 
      :activity_source_type => activity_source.class.to_s, 
      :created_at => activity_source.created_at, 
      :updated_at => activity_source.updated_at)
  end

  def before_destroy(activity_source)
    UserActivity.destroy_all(:activity_source_id => activity_source.id)
  end

end
0 голосов
/ 14 июня 2011

Взгляните на это railscast.

Затем вы можете разбить на страницы 15 статей, а в app/views/articles/index вы можете сделать что-то вроде этого:

 - @articles.each do |article|
   %tr
     %td= article.body
   %tr
     %td= nested_comments article.comment.descendants.arrange(:order => :created_at, :limit => 15)

Это предполагает следующие отношения:

 #app/models/article.rb
 has_one :comment # dummy root comment

 #app/models/comment.rb
 belongs_to :article
 has_ancestry

И вы добавляете комментарии к статье следующим образом:

 root_comment = @article.build_comment
 root_comment.save
 new_comment = root_comment.children.new
 # add reply to new_comment
 new_reply = new_comment.children.new

и т. Д.

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