"合并"多个模型。要创建一个与QUOT;最近的活性QUOT;框多个、创建一个、活性、模型

2023-09-09 22:06:22 作者:沉默褪钌颜色

你如何合并模式,这样我可以有最后的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"

推荐答案

您必须:

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

下面是一些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).

 
精彩推荐
图片推荐