2012-01-05 38 views
21

私はRubyのブール値がクラスであることを知っています。しかし実際的には、ブール値で配列をソートする方法はありますか(つまり、真の値を持つすべての要素が最初にあります)?RailsでBooleanを持つsort_by

ありがとうございます。

答えて

65

あなたはカンニングと、それは数を返すために得ることができる:

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

これはトリックでした...ありがとうございました –

15

あなたはパーティションを使用して、結果を平らにすることもできます(Railsの中に含まれています)ActiveRecord's orderを使用することにより

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

私はこの答えが意図をより詳しく表していると思います... –

+3

あなたが安全な側にいて、意図しない変更を避けたい場合は、 'flatten 1) '。ただし、要素を平坦化できないことがわかっている場合は、上記のコードはより簡潔であるため、問題ありません。 http://ruby-doc.org/core-2.3.0/Array.html#method-i-flatten –

6

を:

collection.order(thing: :desc) 
+0

ベストアンサー!検索されたレコードではなく、SQL側で注文をしましょう。 – Roman

4

ここには2つの異なる方法があるので、私は先に進み、それらをベンチマークしましたブール属性に基づいて27,000項目を並べ替え、最速であるかを確認します

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) 

はそうです、SQL側で物事を保つことは間違いなく物事が速くなります。

関連する問題