2011-07-04 24 views
1

有沒有更好的方法來做到以下幾點?紅寶石(帶導軌)group_by,然後再group_by

prices = Price...all.group_by(&:foreign_key_id) 
@prices = Hash.new 
prices.each {|k, v| @prices[k] = Hash.new if [email protected][k]; @prices[k] = v.group_by {|g| g.created_at.to_time.to_i } } 

我想這樣做

prices.each {|k,v| v = v.group_by(&:created_at) } 

但是,這似乎並沒有工作,因爲v是一個數組,GROUP_BY產生哈希值。也許有辦法通過注入來做到這一點?

回答

1
prices.inject(Hash.new{ |h, k| h[k] = {} }) { |h, (k, v)| 
    h[k] = v.group_by(&:created_at) 
    h 
} 

補充:減函數的方法:

prices.keys.each { |k| 
    prices[k] = prices[k].group_by(&:created_at) 
} 
+0

prices.each_key.to_a〜> prices.keys – andrykonchin

+0

看到注射劑的良好用法總是很好,而且在看完注射劑後很有意義,但我從來不知道這樣做,謝謝! – Scott

+0

@aaz謝謝,我從'.each_key {| k | ......並最終創造了一些非常複雜的東西。糾正。 –

0

可能

prices.each {|k,v| prices[k] = v.group_by(&:created_at) } 

new_prices = {} 
prices.each {|k,v| new_prices[k] = v.group_by(&:created_at) } 

哈希不支持注入

+1

當然哈希支持'inject':'{} .methods.grep /損傷/#=> [:注]'。 'h = {a:1,b:2}; h.inject(0){| s,(k,v)| s + v}#=> 3'。 –

+0

thx,我不知道 – andrykonchin

+0

它支持注入任何類實現'each'和'include Enumerable' –

0

這應該工作:

prices = Price...all.inject({}) do |hash, el| 
    (hash[el.foreign_key_id] ||={})[el.created_at] << el 
    hash 
end 

但我你會得到兩個與created_at相同值的記錄。

您可能需要設置格式爲created_at

事情是這樣的:

prices = Price...all.inject({}) do |hash, el| 
    (hash[el.foreign_key_id] ||={})[el.created_at.to_s(:db)] << el 
    hash 
end 
0

我理解的第二GROUP_BY,但第一個我認爲這將是一個模型的邏輯,所以,取決於你的類型關係的,你可以在模型中使用的選項::uniq => true:group => 'foreign_key_id'。你可以在這裏閱讀http://guides.rubyonrails.org/association_basics.html

+0

你的意思是在'has_many'子句中使用:group?我還沒有嘗試過,但我不得不添加另一個has_many行,將其稱爲別的。我並不總是使用分組價格。 – Scott