Создание «фидов» из нескольких разных моделей Rails - PullRequest
8 голосов
/ 11 февраля 2010

Я работаю над приложением, которое имеет несколько разных моделей (тикеты, посты, отчеты и т. Д.). Данные отличаются в каждой модели, и я хочу создать «канал» из всех этих моделей, который отображает 10 самых последних записей по всем направлениям (смесь всех данных).

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

Ответы [ 2 ]

6 голосов
/ 12 февраля 2010

Вы можете сделать это одним из двух способов в зависимости от требований эффективности.

Менее эффективный метод заключается в извлечении 10 * N элементов, сортировке и уменьшении по мере необходимости:

# Fetch 10 most recent items from each type of object, sort by
# created_at, then pick top 10 of those.
@items = [ Ticket, Post, Report ].inject([ ]) do |a, with_class|
  a + with_class.find(:all, :limit => 10, :order => 'created_at DESC')
end.sort_by(&:created_at).reverse[0, 10]

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

0 голосов
/ 11 февраля 2010

Создание модели элемента, которая включает атрибуты «table_name» и «item_id». Затем создайте частичное для каждого типа данных. После сохранения, скажем, тикета, создайте экземпляр Item:

i = Item.create(:table_name => 'tickets', :item_id => @ticket.id)

В вашем items_controller:

def index
   @items = Item.find(:all, :order => 'created_on DESC')
end

В представлениях / items / index.erb:

<% @items.each do |item| %>
  <%= render :partial => item.table_name, :locals => {:item => item} %><br />
<% end %>
...