【问题标题】:Merge two active record results合并两个活动记录结果
【发布时间】:2014-02-19 19:00:37
【问题描述】:
我有一个小问题。
基本上,我希望从我有一个按日期排序的模型的表中获取项目列表,但日期在最后一小时 (DateTime.now-30.minutes..DateTime.now+30.minutes) 的项目应该出现在结果的顶部。
我需要能够在结果上使用where 和其他活动记录方法,所以+ 是不可能的。
目前我得到两个结果:1 个包含所有记录,1 个包含时间范围内的记录,然后使用 merge 但这会清除第一个数组。
我该怎么做?
【问题讨论】:
标签:
ruby-on-rails
activerecord
【解决方案1】:
你在找这个吗?
@latest = Model1.where...
@all = Model1.all
@merged = @latest | @all
【解决方案2】:
Model.order("date_column DESC") 呢?
有几种方法可以实现这一点。通常你为简单的查询定义一个scope,为更复杂的查询定义一个finder-method。
【解决方案3】:
在 SQL 中,您可以使用 UNION 来合并两个查询。 Rails 不支持 UNION 开箱即用,但 this gist 中的代码应该可以解决问题。我已经尝试过一次,它确实有效,但不确定它是否适合您的需求。
【解决方案4】:
尝试以下方法:
ORDER BY
CASE created_at
WHEN > 1.hour.ago THEN 1
ELSE 2, created_at
如果是 ActiveRecord 范围,它将如下:
order("CASE WHEN created_at>'#{1.hour.ago.to_date}' THEN 1 ELSE 2 END, created_at")
因此您可以使用一个查询而不是两个查询。而且你不需要合并。
如果你展示你的模型,我可以给你更详细的例子