【问题标题】: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")
        

        因此您可以使用一个查询而不是两个查询。而且你不需要合并。

        如果你展示你的模型,我可以给你更详细的例子

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多