簡體   English   中英

Activegroupord查詢與多列上的組返回以數組為鍵的哈希

[英]Activerecord query with group on multiple columns returning a hash with array as a key

我編寫了一個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"]]
# => 7

四種可能的方式(我確定還有其他方式):

# 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) } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM