【问题标题】:sort_by with Boolean in Rails在 Rails 中使用布尔值排序
【发布时间】:2012-01-05 03:08:38
【问题描述】:

我知道 Ruby 中的布尔值是类。但是从实际的角度来看,有没有办法按布尔值对数组进行排序(即所有元素都具有真值)?

谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby sorting boolean


    【解决方案1】:

    你可以作弊并让它返回一个数字:

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

    【讨论】:

      【解决方案2】:

      您可以使用分区,然后将结果展平:

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

      【讨论】:

      • 如果您想安全起见并避免任何意外更改,您可能需要使用flatten(1)。但是,如果您知道元素不能被展平,那么上面的代码就可以了,因为它更简洁。 ruby-doc.org/core-2.3.0/Array.html#method-i-flatten
      • 您不需要进行显式比较 v == true,因为在这种情况下,v 已经返回 true
      • 如果我们想要更加 Rubyish 和聪明,我们可以在对对象进行分区时调用#itself,这相当于给定的解决方案:[true, false, true].partition(& :itself).flatten #=> [true, true, false]
      【解决方案3】:

      通过使用ActiveRecord's order(包含在 Rails 中):

      collection.order(thing: :desc)
      

      【讨论】:

      • 最佳答案!让我们在 SQL 端而不是在检索到的记录中进行排序。
      【解决方案4】:

      由于这里有几种不同的方式,我继续对它们进行基准测试,看看哪种方式最快,根据布尔属性对 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 端肯定会让事情变得更快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-02
        • 2012-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多