Это похоже на загруженный вопрос, и хотя у меня нет времени, чтобы полностью в него разобраться, вот несколько начальных мыслей для вас:
вы можете объединить два типа элементов, которые вы хотите отобразить, в один массив, а затем отсортировать этот массив на основе поля, которое должно быть общим для двух (созданное на ум), чтобы получить их в хронологическом порядке. заказ.
В представлении вы можете использовать эту единственную коллекцию для итерации, а затем использовать помощники и уникальные партиалы для отображения элементов в правильном формате. Это можно сделать, проверив тип объектов, когда вы пытаетесь отобразить его в представлении.
Что-то вроде:
if item.is_a? Message
render :partial => 'message', :locals => {:message => item }
elsif item.is_a? Image
render :partial => 'image', :locals => {:image => item }
end
надеюсь, это поможет некоторым!
РЕДАКТИРОВАТЬ: чтобы объединить массивы, вы можете просто добавить их вместе, используя оператор '+', так как массивы в Ruby не должны содержать один тип объекта.
ваши сообщения Messages.all и Images.all дают вам массивы объектов, поэтому просто попробуйте
@messages + @images
и у вас должен быть объединенный массив.
РЕДАКТИРОВАТЬ # 2: Если бы я писал это сам, я бы, вероятно, обрабатывал взгляды примерно так:
на верхнем уровне, просто передайте свою коллекцию каналов в частичную часть, которая предназначена для отображения одного элемента:
render :partial => "item", :collection => @feed
это отобразит частичное '_item.html.erb' для каждого элемента в @feed. Кроме того, он будет каждый раз давать частичной локальной переменной с именем 'item', которая является элементом в @feed для этой конкретной итерации.
Теперь, я бы, вероятно, имел частичку '_item' очень просто, как это:
<%= display_item(item) %>
где display_item - это вспомогательный метод вне представления, реализованный с помощью "is_a?" введите логику сверху, чтобы выбрать правильный формат отображения для элемента.
причина, по которой я бы разбил это на части, заключается в том, что он использует некоторые замечательные функции рельсов (передайте коллекцию в частичную, а не перебирайте коллекцию самостоятельно), а затем извлекайте логику в помощники (или даже модели, если это имеет смысл) полезно, потому что это упрощает ваши взгляды. Хранение логики вне поля зрения всегда, когда это возможно, является хорошей практикой, поскольку такую логику может быть сложно проверить, а ваши представления станут очень трудно читать.