PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Colunas ORDER BY que às vezes estão vazias usando Active Record &Rails


Você está se deparando com um problema de letras maiúsculas:seus nomes são todos em maiúsculas, mas os e-mails são em minúsculas e, na maioria dos agrupamentos, as letras maiúsculas vêm antes das minúsculas. Confira este exemplo trivial:
#= 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

Portanto, sua consulta está funcionando perfeitamente, é só que [email protected] classifica após Josh . Para evitar isso, você pode classificar pelo valor em minúsculas. Aqui está uma versão simples dos dados que você tem:
#= 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]

Em seguida, para classificar usando o coalesce você está atrás de:
#= 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]

Ou para sua versão completa usando 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"))')