【问题标题】:Activerecord query with group on multiple columns returning a hash with array as a keyActiverecord 查询与多列上的组返回以数组为键的哈希
【发布时间】:2016-06-03 13:43:53
【问题描述】:

我写了一个ActiveRecord 查询来获取一些数据的计数,这些数据按col_acol_b 两列分组后得到

result = Sample.where(through: ['col_a', 'col_b'], status: [1, 5]).where("created_at > ?", 1.month.ago).group(:status, :through).count

这会返回:

{[1, "col_a"]=>7, [1, "col_b"]=>7, [5, "col_a"]=>4, [5, "col_b"]=>1}

现在我的问题是,如何访问此哈希中的值?

执行results[1, "col_a"] 之类的操作会引发错误(参数数量错误)。 我知道我可以通过编写一个循环并逐个提取值来做到这一点。

但是我想知道是否有更惯用的方式来访问这些值,类似于results[1],也许?

【问题讨论】:

  • results[[1, "col_a"]]
  • 错过了嵌套括号。

标签: mysql ruby-on-rails ruby ruby-on-rails-4 activerecord


【解决方案1】:
results[[1, "col_a"]]
# => 7

【讨论】:

    【解决方案2】:

    四种可能的方法(我相信还有其他的):

    # fetch one value at a time
    results[[1, "col_a"]]
    # => 7
    
    # fetch all the values
    results.values
    # => [7, 7, 4, 1]
    
    # loop through keys and values
    results.each do |key, value|
      puts key
      puts value
    end 
    # => [1, "col_a"], 7....
    
    # convert results into a more usable hash
    results.map! { |k,v| { k.join("_") => v } }.reduce({}, :merge)
    results['1_col_a']
    # => 7
    

    另一个较重的选项,特别是如果这是您经常执行的查询,是将结果包装到一个新的 Ruby 对象中。然后,您可以以更惯用的方式解析和使用结果,并定义比[1,'col_a'] 更简单的访问器。

    class SampleGroupResult
      attr_reader key, value
    
      def initialize(key, value)
        @key = key
        @value = value
      end 
    end
    
    results.map { |k,v| SampleGroupResult.new(k,v) } 
    

    【讨论】:

      猜你喜欢
      • 2022-11-12
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      相关资源
      最近更新 更多