大文字と小文字の問題が発生しています。名前はすべて大文字ですが、メールは小文字であり、ほとんどの照合では、大文字が小文字の前に表示されます。この簡単な例を確認してください:
#= select * from (values ('b'), ('B'), ('a'), ('A')) t (letter);
letter
--------
b
B
a
A
#= select * from (values ('b'), ('B'), ('a'), ('A')) t (letter) order by letter;
letter
--------
A
B
a
b
したがって、クエリは実際には完全に機能しています。[email protected]
Josh
の後に並べ替えます 。これを回避するには、小文字の値で並べ替えることができます。所有しているデータの簡単なバージョンは次のとおりです。
#= select * from volunteers;
first_name | last_name | email
------------+-----------+--------------------
Josh | Broger | [email protected]
Josh | Kenton | [email protected]
∅ | ∅ | [email protected]
Josh | Broger | [email protected]
Alex | Diego | [email protected]
次に、coalesce
を使用して並べ替えます あなたが求めているのは:
#= select * from volunteers order by lower(coalesce(first_name, email));
first_name | last_name | email
------------+-----------+--------------------
Alex | Diego | [email protected]
∅ | ∅ | [email protected]
Josh | Broger | [email protected]
Josh | Broger | [email protected]
Josh | Kenton | [email protected]
または、ActiveRecord
を使用したフルバージョンの場合 :
Volunteer
.joins(:volunteer_lists)
.where(
"(volunteer_lists.organizer_id = ? AND organizer_type = 'Organization') OR (volunteer_lists.organizer_id IN (?) AND organizer_type = 'Collaborative')",
organization.id, collaboratives
)
.order('LOWER(COALESCE("volunteers"."first_name", "volunteers"."last_name", "volunteers"."email"))')