98 votes

Rails: Ordre avec NULL en dernier

Dans mon application Rails, j'ai une question à quelques reprises, et j'aimerais savoir comment d'autres personnes à résoudre:

J'ai certains dossiers où une valeur est facultative, de sorte que certains documents ont une valeur, et certains sont nuls pour cette colonne.

Si je commande par la colonne sur certaines bases de données, les valeurs null de tri d'abord et sur certaines bases de données, les valeurs null de tri dernier.

Par exemple, j'ai des Photos de ce qui peut ou peut ne pas appartenir à une Collection, c'est à dire il y a quelques Photos où l' collection_id=nil et certains où collection_id=1 etc.

Si je n' Photo.order('collection_id desc) alors sur SQLite-je obtenir les valeurs null dernier mais sur PostgreSQL-je obtenir les valeurs null en premier.

Est-il gentil, standard Rails façon de gérer cela et d'obtenir des performances constantes à travers une base de données?

293voto

Intentss Points 4591

Je ne suis pas un expert en SQL, mais pourquoi ne pas trier si quelque chose est nul en premier, puis trier par la façon dont vous voulez le trier.

 Photo.order('collection_id IS NULL, collection_id DESC')  # Null's last
Photo.order('collection_id IS NOT NULL, collection_id DESC') # Null's first
 

Si vous utilisez uniquement PostgreSQL, vous pouvez également le faire

 Photo.order('collection_id DESC NULLS LAST')  #Null's Last
Photo.order('collection_id DESC NULLS FIRST') #Null's First
 

Mais SQLite3 vous donnera des erreurs.

13voto

raymondralibi Points 1416

Placez le signe moins devant nom_colonne et inversez le sens de l'ordre. Cela fonctionne sur mysql. Plus de détails

 Product.order('something_date ASC') # NULLS came first
Product.order('-something_date DESC') # NULLS came last
 

7voto

Le moyen le plus simple consiste à utiliser:

.order('name nulls first')

-4voto

Eric Points 1338

Ajouter des tableaux ensemble préservera l'ordre:

 @nonull = Photo.where("collection_id is not null").order("collection_id desc")
@yesnull = Photo.where("collection_id is null")
@wanted = @nonull+@yesnull
 

http://www.ruby-doc.org/core/classes/Array.html#M000271

-4voto

jaredonline Points 2011

Il semblerait que vous deviez le faire dans Ruby si vous souhaitez obtenir des résultats cohérents pour tous les types de base de données, car la base de données elle-même interprète si NULLS doit être placé au début ou à la fin de la liste.

 Photo.all.sort {|a, b| a.collection_id.to_i <=> b.collection_id.to_i}
 

Mais ce n'est pas très efficace.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X