Вы должны:
- элементы запроса для каждой модели
- объединить их в едином формате
- сортировка и ограничение
Вот код:
class Activity < Struct.new(:title, :text, :date); end
limit = 10
activities = []
activities += Post.all(:order => 'created_at DESC', :limit => limit).map do |post|
Activity.new(post.title, post.summary, post.created_at)
end
activities += Planet.all(:order => 'published_at DESC', :limit => limit).map do |planet|
Activity.new(planet.title, planet.message, planet.published_at)
end
activities += Message.all(:conditions => ['receiver_id = ?', current_user.id], :order => 'created_at DESC', :limit => limit).map do |message|
Activity.new(message.title, message.text, message.created_at)
end
# descending sort by 'date' field
sorted_activities = activities.sort_by(&:date).reverse
# 10 most recent elements across all models
@activities = sorted_activities[0..(limit-1)]
Конечно, в зависимости от ваших моделей вам придется изменить, какой метод используется в качестве «заголовка» или «текста».
Но если вам понадобится много таких идиом, вам следует использовать наследование одной таблицы, как мы это делаем в zena (CMS для рельсов).