代码之家  ›  专栏  ›  技术社区  ›  pzin

根据第三个属性按不同属性对ActiveRecord集合排序

  •  0
  • pzin  · 技术社区  · 6 年前

    我有一个 Order

    • 创建于 日期时间
    • 日期时间
    • 字符串

    我想做的是,按 created_at delivery_at status .

    创建于 交货地点 日期时间。

    def status_date
      if status == 'on_delivery'
        delivered_at.to_datetime
      else
        created_at.to_datetime
      end
    end
    

    然后在控制器中:

    created = Order.where(status: 'open')
    on_delivery = Order.where(stauts: 'on_delivery')
    
    orders = created + on_delivery
    orders.sort_by(&:status_date)
    

    我试图实现一个按时间顺序排列的订单列表,但是DateTime应该与其状态相关。

    1 回复  |  直到 6 年前
        1
  •  1
  •   mu is too short    6 年前

    您可以在数据库中一次查询这两种状态,然后使用SQL CASE表达式进行排序:

    case status
    when 'open' then created_at -- if the status is open then use created_at
    else delivered_at           -- otherwise use delivered_at
    end
    

    您只有两种状态,因此这些分支就足够了。

    把它放在一起:

    orders = Order.where(status: %w[open on_delivery])
                  .order(Arel.sql("case status when 'open' then created_at else delivered_at end"))
    

    Arel.sql 需要获取SQL字符串 #order