ruby(w / rails)group_by,然后再次group_by

时间:2011-07-04 12:59:08

标签: ruby-on-rails ruby group-by

有更好的方法来执行以下操作吗?

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产生一个哈希。也许有一种方法可以通过注入来实现这一点吗?

4 个答案:

答案 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