2012-01-05 45 views
21

我知道Ruby中的布爾類是類。但從實際角度來看,是否有一種方法可以通過布爾值對數組進行排序(即,首先使用所有具有真值的元素)?sort_by與Rails中的布爾值

謝謝。

回答

65

你可以欺騙,並得到它返回一個數字:

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

這些做的伎倆...非常感謝 – 2013-05-20 23:09:15

15

您可以使用分區,然後壓平的結果:

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

我認爲這個答案表示意圖更多.... – 2014-09-17 21:46:16

+3

如果你想在安全的一面,並避免任何意想不到的變化,你可能想使用'flatten( 1)'。但是,如果你知道元素不能被平滑,那麼上面的代碼就可以更簡潔了。 http://ruby-doc.org/core-2.3.0/Array.html#method-i-flatten – 2016-01-07 23:26:17

6

通過使用ActiveRecord's order(包括在Rails的):

collection.order(thing: :desc) 
+0

最佳答案!讓我們在SQL端進行排序,而不是在檢索到的記錄中。 – Roman 2015-06-08 15:26:35

4

由於這裏代表了幾種不同的方式,我繼續進行基準測試看看這是最快的,排序基於布爾屬性27000項:

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方面絕對會讓事情更快。