组合2个对象和排序轨道5

我想显示一个时间链接混合评论和发布所以我有这个对象

@posts = Post::all() @comments = Comment::all() 

如果我这样做

 @post.each ... ... end @comments.each ... ... end 

我会得到第一篇文章,然后是评论。 但我想要一个时间表,我怎么能创造这个?

我需要结合两个对象来创建一个有序列表,例如:

在post中:

 id | name | date 1 | post1 | 2015-01-01 2 | post2 | 2013-01-01 

在评论中:

 id | name | date 1 | comment1 | 2014-01-01 2 | comment2 | 2016-01-01 

如果我这样做post.each … comments.each …

结果将是:

 -post1 -post2 -comment1 -comment2 

但我需要按日期订购才能获得

 -post2 -comment1 -post1 -comment2 

谢谢,对不起我丑陋的英语。

post和评论是不同的模型(和不同的表),所以我们不能编写SQL来获取排序集合,分页等。

通常我在需要混合时间线时使用下一种方法。

我有TimelineItem模型,包含source_idsource_typetimeline_at字段。

 class TimelineItem < ApplicationRecord belongs_to :source, polymorphic: true end 

然后我添加模型逻辑以在需要时创建timeline_item实例:

 has_many :timeline_items, as: :source after_create :add_to_timeline def add_to_timeline timeline_items.create timeline_at: created_at end 

然后搜索和输出就像

 TimelineItem.includes(:source).order(:timeline_at).each { |t| pp t.source } 

解决方案#1您可以使用UNION查询来实现此目的。

 sql= 'SELECT id, name, date FROM posts UNION ALL SELECT id, name, date FROM comments ORDER BY date' ActiveRecord::Base.connection.execute(sql) 

但联合查询仅在两个表中具有相同列名时才起作用。

解决方案#2在视图中添加排序逻辑。

如果您只是在html页面上显示这些记录,那么让它们在页面上加载而不需要任何特定的顺序即(首先发布post然后评论)。 编写javascript代码来排序将在页面加载后运行的DOM元素。

for ref: Jquery – 通过孩子们的innerHTML对DIV进行排序

解决方案#3重构数据库架构并将post和注释放在同一个数据库表中。 然后,您将能够在单个表上查询。 像这样的东西,

 class Text < ActiveRecord::Base end class Post < Text end class Comment < Text end 

查询将是Text.order(:date)

重构数据库模式太多,无法解决此问题。 如果对您的应用程序有意义,请执行此操作。