2012-01-05 36 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方面绝对会让事情更快。