Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 组合2个对象并对rails 5进行排序_Ruby On Rails_Ruby_Object - Fatal编程技术网

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