【问题标题】:How to make order apply only to non-null records yet get all records?如何使订单仅适用于非空记录但获取所有记录?
【发布时间】:2015-09-16 13:06:40
【问题描述】:

我想根据条件对结果进行排序。

例如

@redeemables = @business.redeemables.order(expiry_date: :desc)

我想要expiry_date => nil 的所有可兑换物品,而不是按 desc 订购的可兑换物品

在其他方式中,具有exipry_date < Date.current 的可兑换应在顺序中排在最后。

我该怎么做?谢谢

【问题讨论】:

  • 我有点惊讶,订购 desc 时,nil 值应该显示在顶部。你用什么数据库?

标签: mysql ruby-on-rails ruby rails-activerecord


【解决方案1】:

得到你想要的最简单的方法是:

@redeemables = @business.redeemables.order("-expiry_date asc")
  • 这将为您提供 (expiry_date: asc) 的反向结果
  • 表示按expiry_date降序排列,null优先

【讨论】:

    【解决方案2】:

    如果您使用的是 PostgreSQL,则有很好的 NULLS FIRST(与 NULLS LAST 相比)语句,但是有标准的 SQL 方式来执行此操作(CASE 基本上总是有效),因为 relation + relation 将触发急切加载,您可能不希望发生这种情况。

    @redeemables = @business.redeemables.order('(CASE WHEN expiry_date IS NULL THEN 1 ELSE 0 END) desc, expiry_date desc')
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

      @redeemables_without_expiry = @business.redeemables.where("expiry_date IS NULL")
      @redeemables_with_expiry = @business.redeemables.where("expiry_date IS NOT NULL").order(expiry_date: :desc)
      
      @redeemables = @redeemables_without_expiry + @redeemables_with_expiry
      

      【讨论】:

      • 谢谢,但我认为仅运行 2 个订单查询不是一个好的解决方案
      • 没问题,兄弟。只是一个可能的解决方案。
      【解决方案4】:

      试试这样的:

      @redeemables = @business.redeemables.sort_by {|r| "#{r.expiry_date.blank?} #{r.desc}" }
      

      它的基本作用是通过连接字符串的到期日期是否为空白(true/false)和描述进行排序。 (例如false item_description)。

      如果要更改 nil expiry_dates 的排序顺序,可以执行以下操作:

      @redeemables = @business.redeemables.sort_by {|r| "#{r.expiry_date.present?} #{r.desc}" }
      

      【讨论】:

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