2016-06-03 3 views
1

zurückkehr Ich schrieb eine ActiveRecord Abfragezählung einiger Daten zu holen, nachdem er von zwei Spalten Gruppierungs col_a und col_bactive Abfrage mit der Gruppe auf mehreren Spalten eine Hash mit Array als Schlüssel

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

Dies gibt:

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

Nun meine Frage ist, wie kann ich auf die Werte in diesem Hash?

So etwas wie results[1, "col_a"] verursacht einen Fehler (falsche Anzahl von Argumenten). Ich weiß, dass ich dies tun kann, indem ich eine Schleife schreibe und die Werte eins nach dem anderen extrahiere.

Allerdings möchte ich wissen, ob es einen idiomatischen Weg gibt, auf die Werte zuzugreifen, etwas ähnlich wie results[1], vielleicht?

+1

'Ergebnisse [[1," col_a "]]' – lusketeer

+0

In den verschachtelten Klammern verpasst. – tekina

Antwort

2
results[[1, "col_a"]] 
# => 7 
1

Vier Möglichkeiten (ich bin sicher, dass es andere gibt):

# 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 

Ein weiterer schwerer Option, vor allem wenn es sich um eine Abfrage, die Sie oft tun, ist es, die Ergebnisse in eine neue wickeln Ruby-Objekt. Dann können Sie die Ergebnisse analysieren und die Ergebnisse in einer idiomatischen Weise verwenden und einen Accessor einfacher als [1,'col_a'] definieren.

class SampleGroupResult 
    attr_reader key, value 

    def initialize(key, value) 
    @key = key 
    @value = value 
    end 
end 

results.map { |k,v| SampleGroupResult.new(k,v) } 
Verwandte Themen