结合两个查询的结果并按 created_at 排序? [导轨 3]
Posted
技术标签:
【中文标题】结合两个查询的结果并按 created_at 排序? [导轨 3]【英文标题】:combine results from two queries and order by created_at? [rails 3] 【发布时间】:2011-07-09 07:31:33 【问题描述】:寻找一种简单的方法,利用活动记录从两个模型中抓取数据,合并数据,然后按 created_at 对合并后的输出进行排序。
例如:
假设有两个模型,Comment & Like both belongs_to User
返回按日期排序的@user 的 cmets 和 likes 的组合列表
我知道我可以在 SQL 中做到这一点,但我真的很想要一个活动记录解决方案。
谢谢!
【问题讨论】:
【参考方案1】:我认为应该很简单:
combined_sorted = (User.comments + User.likes).sort|a,b| a.created_at <=> b.created_at
【讨论】:
这让我更接近,在一个数组中返回两个查询结果,但它不会根据 created_at 混合它们。它返回由 created_at 排序的 cmets,然后是由 created_at 排序的喜欢。我需要将所有记录混合在一起,以便获得按时间顺序排列的评论/点赞活动流 此解决方案有效,但存在严重的性能(内存)问题,因为您将所有记录加载到内存中并要求 Ruby 进行排序。我想要一个使用数据库进行排序的答案。【参考方案2】:怎么样(未经测试):
class User < ActiveRecord::Base
scope :activities_by_date, :joins(:comments).joins(:likes).order("created_at desc")
end
那你就可以@user.activities_by_date
,让db做所有的工作
【讨论】:
另外,您正在通过用户实例调用范围。它应该是:User.activities_by_date
以上是关于结合两个查询的结果并按 created_at 排序? [导轨 3]的主要内容,如果未能解决你的问题,请参考以下文章
在 Postgresql 中查找最近的不同记录并按 created_at 排序