我的email_invitations
表包含三个日期时间列,sent_at
,opened_at
和rsvped_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
答案 0 :(得分:2)
据推测:
sent_at
永远不会是nil
。opened_at
为nil
,那么rsvped_at
。sent_at
最多只能opened_at
或opened_at
nil
。opened_at
不是nil
,那么它总是最多rsvped_at
或rsvped_at
将是nil
。这意味着您真正尝试按照
中的第一个非nil
条目进行排序
[rsvped_at, opened_at, sent_at]
右?这与尝试选择该列表中的第一个非NULL条目并按此排序相同。使用COALESCE表达非常简单:
order('coalesce(rsvped_at, opened_at, sent_at) desc')
SQL COALESCE函数只返回非参数的第一个(从左到右)。