【问题标题】:Group and count in Rails在 Rails 中分组和计数
【发布时间】:2011-01-02 14:25:11
【问题描述】:

我知道我以前见过这个,但我现在找不到任何东西。我想按某个列对查询进行分组,并能够显示每组中有多少个。我把第一部分记下来了:

@line_items = @project.line_items.all(:group => "device_id")  

这是我的订单项索引视图,它只是一个显示订单项的表格。既然订单项按设备分组,如何在该表中为“计数”创建一列?

【问题讨论】:

    标签: ruby-on-rails count


    【解决方案1】:

    devise_id 的散列作为键和相关记录计数

    @project.line_items.group(:device_id).count
    

    【讨论】:

      【解决方案2】:

      我想你也可以试试这个。

      @project.line_items.group(:device_id).pluck("device_id, count(device_id)")
      

      ^^ 这给出了包含元素 'device_id 和 count' 的数组数组

      【讨论】:

        【解决方案3】:

        仅计数 pluck 会比 group

        更快
        @project.line_items.pluck(:device_id).count
        
        
        @project.line_items.pluck(:device_id).uniq.count
        

        【讨论】:

        • 它们将针对枚举属性返回完全不同的结果。例如:customer_subscriptions.group(:status).count 将返回:{1 => 6, 2 => 11, 3 => 136, 0 => 30}customer_subscriptions.pluck(:status).count 将只返回 183
        • 是的,那么 uniq 呢? @project.line_items.pluck(:device_id).uniq.count
        【解决方案4】:

        您可以在line_items 上执行count,这将返回一个有序的device_idcount 散列。

        @project.line_items.group(:device_id).count
        

        【讨论】:

        • 这会发出警告:DEPRECATION WARNING: Relation#calculate with finder options is deprecated. Please build a scope and then call calculate on it instead. (called from C:in 'count':)
        • @Chloe - 在 Rails 4 中试试这个以消除警告:@project.line_items.group(:device_id).count
        【解决方案5】:

        这次提交之后:

        https://github.com/rails/rails/commit/a1c05dd8b9bd3623289d3aa73dda2943d620cc34

        有一种新方法可以做同样的事情:

        @project.line_items.count(:group => LineItem.arel_table[:device_id])
        

        【讨论】:

          【解决方案6】:

          类似

           User.all(:joins => :comments, :select => "users.*, count(comments.id) as comments_count", :group => "users.id")
          

          也许也可以……

          【讨论】:

            【解决方案7】:

            只需添加一个:select 选项:

            @line_items = @project.line_items.all(
              :group  => "device_id",
              :select => "device_id, COUNT(*) as count"
            )
            

            那么每个@line_item 都会有一个count 属性。

            【讨论】:

            • hrm,我把 debug(@line_items) 放在我的视图中,但我没有看到任何计数,所以我认为我不理解你。我认为输出与没有选择选项时完全相同。
            • 调试方法不会显示计数,因为它不是 ActiveRecord 属性,但每个对象都有 计数属性。无论如何,Chandra 的解决方案要好得多。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-12-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-08
            相关资源
            最近更新 更多