2012-01-05 15 views
21

Sé que booleano en Ruby son clases. Pero desde el punto de vista práctico, ¿hay alguna forma de ordenar una matriz por booleano (es decir, con todos los elementos con valor verdadero primero)?sort_by con Boolean en Rails

Gracias.

Respuesta

65

Se puede engañar y conseguir que vuelva un número:

sort_by { |a| a.thing ? 0 : 1 } 
+1

estos hicieron el truco ... muchas gracias –

15

Usted podría utilizar la partición y luego aplanar los resultados:

partition{|v| v == true}.flatten 
+0

Creo que esta respuesta expresa la intención más .... –

+3

Si quieres estar seguro y evitar los cambios involuntarios, es posible que desees utilizar 'aplanar (1) '. Sin embargo, si sabes que los elementos no se pueden aplanar, entonces el código anterior está bien, ya que es más conciso. http://ruby-doc.org/core-2.3.0/Array.html#method-i-flatten –

6

Mediante el uso de ActiveRecord's order (incluido en rieles):

collection.order(thing: :desc) 
+0

¡La mejor respuesta! Hagamos el pedido en el lado SQL no en los registros recuperados. – Roman

4

Dado que hay un par de formas diferentes representadas aquí, seguí adelante y las comparé para ver cuál es el más rápido, clasificación 27,000 artículos basados ​​en un atributo booleano:

Rehearsal --------------------------------------------- 
sort_by  0.070000 0.000000 0.070000 ( 0.075203) 
partition 0.110000 0.000000 0.110000 ( 0.114667) 
order  0.000000 0.000000 0.000000 ( 0.000046) 
------------------------------------ total: 0.180000sec 

      user  system  total  real 
sort_by  0.010000 0.000000 0.010000 ( 0.016611) 
partition 0.110000 0.000000 0.110000 ( 0.111384) 
order  0.000000 0.000000 0.000000 ( 0.000047) 

Así que sí, mantener las cosas en el lado de SQL definitivamente hace las cosas más rápido.