Создание “каналов” из нескольких разных моделей Rails

StackOverflow https://stackoverflow.com/questions/2246479

Вопрос

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

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

Это было полезно?

Решение

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

Менее эффективный метод заключается в извлечении 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 за раз, вы можете агрессивно сократить это, используя какую-нибудь задачу rake, чтобы ограничить его до 10 на пользователя или любой другой требуемой области.

Другие советы

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

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

В вашем items_controller:

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

В views/items/index.erb:

<% @items.each do |item| %>
  <%= render :partial => item.table_name, :locals => {:item => item} %><br />
<% end %>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top