"合并"多个模型。要创建一个与QUOT;最近的活性QUOT;框 [英] "merging" multiple models. To create a "recent activity" box

查看:132
本文介绍了"合并"多个模型。要创建一个与QUOT;最近的活性QUOT;框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你如何合并模式,这样我可以有最后的10篇,订阅条目和顺序显示悄悄话?

How do you merge models so that I can have the last 10 Posts, Feed Entries and Private Messages displayed in order?

帖子都存储在邮报的模型,并下令created_at

Posts are stored in the "Post" model and ordered on "created_at"

供稿项目都存储在行星,并下令published_at

Feed Entries are stored in "Planet" and ordered on "published_at"

私人消息存储在消息,需要过滤,用:

Private Messages are stored in "Message" and need to be filtered with:

:conditions => "receiver_id = #{current_user.id}"

和有序的created_at

and ordered on "created_at"

推荐答案

您必须:

  1. 在每个模型查询元素
  2. 在一个共同的格式将它们合并
  3. 类和限制

下面是一些code:

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)]

当然,这取决于你的模型,你将不得不改变使用哪种方法为标题或文本。

Of course, depending on your models, you will have to change which method is used as "title" or "text".

但是,如果你碰巧需要很多这样的成语,你应该使用单表继承,因为我们在泽纳做(一轨CMS)。

But if you happen to need many of such idioms, you should use Single Table Inheritance as we do in zena (a rails CMS).

这篇关于&QUOT;合并&QUOT;多个模型。要创建一个与QUOT;最近的活性QUOT;框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆