有更好的方法来执行以下操作吗?
prices = Price...all.group_by(&:foreign_key_id)
@prices = Hash.new
prices.each {|k, v| @prices[k] = Hash.new if !@prices[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产生一个哈希。也许有一种方法可以通过注入来实现这一点吗?
答案 0 :(得分: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)
}
答案 1 :(得分: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) }
哈希不支持注入
答案 2 :(得分: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
答案 3 :(得分:0)
我理解第二个group_by,但第一个我认为它将是一个模型逻辑,因此,取决于您可以在模型中使用的关系类型选项::uniq => true
或:group => 'foreign_key_id'
。你可以在这里阅读http://guides.rubyonrails.org/association_basics.html