Ruby on rails 组合2个对象并对rails 5进行排序
我想显示一个时间链接混合评论和帖子,所以我有这个对象Ruby on rails 组合2个对象并对rails 5进行排序,ruby-on-rails,ruby,object,Ruby On Rails,Ruby,Object,我想显示一个时间链接混合评论和帖子,所以我有这个对象 @posts = Post::all() @comments = Comment::all() 如果我这样做 @post.each ... ... end @comments.each ... ... end 我会得到第一个帖子,然后是评论。但我想要一个时间表,我如何才能创造这个 我需要将这两个对象组合起来,以创建一个有序列表,例如: 在岗: id | name | date 1 | post1 | 2015-01-01 2 | post
@posts = Post::all()
@comments = Comment::all()
如果我这样做
@post.each ...
... end
@comments.each ...
... end
我会得到第一个帖子,然后是评论。但我想要一个时间表,我如何才能创造这个
我需要将这两个对象组合起来,以创建一个有序列表,例如:
在岗:
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
如果我这样做
每个。。。
评论。每个
结果将是:
-post1
-post2
-comment1
-comment2
但我需要按日期订购才能拿到
-post2
-comment1
-post1
-comment2
谢谢,很抱歉我的英语不好。帖子和评论是不同的模型(和不同的表),因此我们无法编写SQL来获取排序集合,以及分页等 当我需要混合时间线时,通常使用下一种方法 我有
TimelineItem
模型,带有source\u id
、source\u type
和timeline\u的
字段
class TimelineItem < ApplicationRecord
belongs_to :source, polymorphic: true
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页面上显示这些记录,那个么就让它们加载到页面上,而不需要任何特定的顺序,即(先发布,然后评论)。编写javascript代码对页面加载后运行的DOM元素进行排序
参考:
解决方案#3重构数据库模式,并将帖子和注释放在同一数据库表中。然后您将能够查询单个表。
像这样的,
class Text < ActiveRecord::Base
end
class Post < Text
end
class Comment < Text
end
class Text
查询将是Text.order(:date)
重构数据库模式太多,无法解决此问题。如果对您的应用程序有意义,请执行此操作。什么是时间线,您希望我们如何帮助您创建时间线?我认为OP需要一个按日期/时间排序的列表。这就是所谓的时间线。请注意,
Post::all()
应该是Post。all
,因为方法调用应该使用
进行,而空参数列表通常被省略。在像这样加载宇宙时,我也会非常小心,因为您的posts表可能包含数百万条记录,而这段代码会因为内存不足而立即使您的应用程序崩溃。只要实际可行,就尝试使用分页。是的,专用的时间线模型是可行的。然而,这段代码有huuuuge N+1查询问题:)@SergioTulentsev如果您不在这里,它至少在Rails 4.2Ah中工作,实际上,它已经被后端口化了,看起来:我现在明白了,漂亮的印刷品。OP也可以有从帖子到评论的关系。我认为这会有所帮助。是的,选项1和选项3实际上并不可行。两个都不是!在这种情况下,分页是不可能的。
class Text < ActiveRecord::Base
end
class Post < Text
end
class Comment < Text
end