【问题标题】:Rails : How to merge or join two active record collection?Rails:如何合并或加入两个活动记录集合?
【发布时间】:2016-02-11 11:10:34
【问题描述】:

在我的客户控制器中,我有两个集合如下:

第一个是获取过期日期列具有有效日期的客户集合,如下所示:

@customer_with_expirydate = Customer.where.not(expiryDate: nil)

第二个是获取过期日期列为零或不存在的客户集合,如下所示:

@customer_no_expirydate = Customer.where(expiryDate: nil)

现在我想将这两个集合的组合结果显示为一个表结构,这里的一个条件是在列出所有具有 expiryDate 的客户之后,只需要列出没有到期的客户。

我需要类似以下的东西:

@all_customers = @customer_with_expirydate + @customer_no_expirydate

重要的是没有过期的客户应该最后添加。

【问题讨论】:

  • 我不记得它会以哪种方式工作,但与其做两个查询,不如做一个并按到期日期订购。 @all_customers = Customer.order(expiry_date: :desc) 可能需要升序才能使那些没有到期日期的最后一个。

标签: ruby-on-rails ruby-on-rails-4 plsql rails-activerecord


【解决方案1】:

只用一个查询来做一些简单的事情怎么样?类似的东西:

@all_customers = Customer.order(expiryDate: :desc)

【讨论】:

    【解决方案2】:

    @Praveen 你已经给出的答案:

    @all_customers = @customer_with_expirydate + @customer_no_expirydate
    

    返回所有有到期日的客户,然后是没有到期日的客户。

    类似:

    @all_customers = @customer_no_expirydate + @customer_with_expirydate
    

    返回所有没有到期日的客户,然后是有到期日的客户。

    Then you can loop @all_customers inside the table.
    

    如果你只能使用一个查询,那么你应该使用:

    @all_customers = Customer.order(expiryDate: :desc)
    

    【讨论】:

      【解决方案3】:

      通过db查询对客户进行排序,比使用数组追加效率更高:

      @ordered_customers = Customer.order('expiryDate DESC NULLS LAST')
      

      所以expiryDate = nil 的客户将在您的结果末尾!

      【讨论】:

      • 谢谢老兄让我试试这个:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-01
      相关资源
      最近更新 更多