如何在最近的日期订购表格列?

时间:2016-03-28 17:52:24

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

我的email_invitations表包含三个日期时间列,sent_atopened_atrsvped_at。如何按日期按升序对三列进行排序(最近一次在顶部)?

我在rails中使用default_scope

default_scope { order('sent_at ASC' }

这就是我所拥有的

EmailInvitation
id: 1, sent_at: "2016-03-24", opened_at: "2016-03-25", rsvped_at: "2016-03-25"
id: 2, sent_at: "2016-03-24", opened_at: "2016-03-25", rsvped_at: "2016-04-01"
id: 3, sent_at: "2016-03-23", opened_at: "2016-03-24", rsvped_at: nil
id: 4, sent_at: "2016-03-29", opened_at: nil, rsvped_at: nil

使用EmailInvitation.order(sent_at: :asc, opened_at: :asc, rspved_at: :asc)看起来先对sent_at进行排序,然后是opens_at,然后是rsvped_at。

id: 4, sent_at: "2016-03-29", opened_at: nil, rsvped_at: nil
id: 1, sent_at: "2016-03-24", opened_at: "2016-03-25", rsvped_at: "2016-03-25"
id: 2, sent_at: "2016-03-24", opened_at: "2016-03-25", rsvped_at: "2016-04-01"
id: 3, sent_at: "2016-03-23", opened_at: "2016-03-24", rsvped_at: nil

但我真正想要的是最近日期的内容将位于顶部,所以我需要加入所有列,以便它不会查看列名,只查看日期。

id: 2, sent_at: "2016-03-24", opened_at: "2016-03-25", rsvped_at: "2016-04-01"
id: 4, sent_at: "2016-03-29", opened_at: nil, rsvped_at: nil
id: 1, sent_at: "2016-03-24", opened_at: "2016-03-25", rsvped_at: "2016-03-25"
id: 3, sent_at: "2016-03-23", opened_at: "2016-03-24", rsvped_at: nil

1 个答案:

答案 0 :(得分:2)

据推测:

  1. sent_at永远不会是nil
  2. 如果opened_atnil,那么rsvped_at
  3. sent_at最多只能opened_atopened_at nil
  4. 如果opened_at不是nil,那么它总是最多rsvped_atrsvped_at将是nil
  5. 这意味着您真正尝试按照

    中的第一个非nil条目进行排序
    [rsvped_at, opened_at, sent_at]
    

    右?这与尝试选择该列表中的第一个非NULL条目并按此排序相同。使用COALESCE表达非常简单:

    order('coalesce(rsvped_at, opened_at, sent_at) desc')
    

    SQL COALESCE函数只返回非参数的第一个(从左到右)。