2012-01-05 11 views
21

So che boolean in Ruby sono classi. Ma dal punto di vista pratico, c'è un modo per ordinare un array per booleano (vale a dire, con tutti gli elementi con valore vero per primo)?sort_by con Boolean in Rails

Grazie.

risposta

65

Si potrebbe barare e farlo tornare un numero:

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

questi hanno fatto il trucco ... grazie mille –

15

Si potrebbe utilizzare partizioni e poi appiattire i risultati:

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

Penso che questa risposta esprima l'intento di più .... –

+3

Se vuoi essere dalla parte della sicurezza ed evitare modifiche involontarie, potresti voler usare 'flatten (1) '. Tuttavia, se si sa che gli elementi non possono essere appiattiti, il codice precedente va bene in quanto è più conciso. http://ruby-doc.org/core-2.3.0/Array.html#method-i-flatten –

6

Utilizzando ActiveRecord's order (incluso in Rails):

collection.order(thing: :desc) 
+0

La migliore risposta! Facciamo l'ordine sul lato SQL non nei record recuperati. – Roman

4

Poiché ci sono un paio di modi diversi rappresentati qui, sono andato avanti e li ho confrontati per vedere quale è più veloce, l'ordinamento 27.000 articoli basati su un attributo 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) 

Quindi sì, mantenere le cose sul lato SQL rende sicuramente le cose più velocemente.