2016-03-28 9 views
1

sent_at,opened_atrsvped_atの3つのdatetimeカラムを持つemail_invitationsテーブルがあります。日付順に3つの列を並べ替えるにはどうすればいいですか?テーブルの列を最新の日付で注文するにはどうすればよいですか?

私はレールに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 

はrsvped_atその後、opened_atそして、それは最初sent_atソートするように見えるEmailInvitation.order(sent_at: :asc, opened_at: :asc, rspved_at: :asc)を使用して持っているものです。

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

あなたはAthonysの答えに満足していないので、いくつかのサンプルデータと期待される結果を表示できますか? –

+0

編集:昇順が必要、降順でない – cvDv

答えて

2

  1. sent_atnilになることはありません。
  2. opened_atnilの場合は、rsvped_atです。
  3. sent_atは常に最大でopened_atまたはopened_atnilになります。
  4. opened_atnilでない場合、それは常に最大でrsvped_atまたはrsvped_atnilになります。あなたが本当に

    [rsvped_at, opened_at, sent_at] 
    

    右に最初の非nilのエントリでソートしようとしていることを意味し

?これは、そのリスト内の最初の非NULL項目を選んでそれをソートしようとするのと同じです。それは、COALESCEを使用して表現するために非常に簡単です:

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

SQLのCOALESCE関数は、単にNULLでない引数の(左から右へ)最初を返します。

関連する問題