我想显示一个混合评论和帖子的时间链接,这样我就有了这个对象
@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谢谢,并为我丑陋的英语道歉。
发布于 2016-11-20 02:46:05
帖子和评论是不同的模型(和不同的表),所以我们不能编写SQL来获得排序的集合,以及分页等。
通常,当我需要混合时间线时,我会使用next方法。
我有source_id,source_type和timeline_at字段的TimelineItem模型。
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 }发布于 2016-11-20 04:41:18
Solution#1您可以使用联合查询来实现这一点。
sql= 'SELECT id, name, date FROM posts UNION ALL SELECT id, name, date FROM comments ORDER BY date'
ActiveRecord::Base.connection.execute(sql)但是,联合查询只有在两个表中具有相同的列名时才会起作用。
Solution#2在视图中添加排序逻辑。
如果你只是简单地在html页面上显示这些记录,那么让它们在页面上加载,而不需要任何特定的顺序,即(首先发布,然后评论)。编写javascript代码来排序DOM元素,这些元素将在页面加载后运行。
参考:Jquery - sort DIV's by innerHTML of children
Solution#3重构您的数据库模式,并将帖子和评论放在同一数据库表中。然后,您将能够对单个表进行查询。就像这样,
class Text < ActiveRecord::Base
end
class Post < Text
end
class Comment < Text
end查询将为Text.order(:date)
重构您的DB模式太多了,无法解决这个问题。如果它对您的应用程序有意义,就这样做。
https://stackoverflow.com/questions/40696456
复制相似问题