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

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

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

8
задан jsiarto 11 February 2010 в 17:59
поделиться

2 ответа

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

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

6
ответ дан 5 December 2019 в 22:18
поделиться

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

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 %>
0
ответ дан 5 December 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: