ruby (w / rails) group_by, затем group_by снова - PullRequest
1 голос
/ 04 июля 2011

Есть ли лучший способ сделать следующее?

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 создает хеш. Возможно, есть способ сделать это с помощью inject?

Ответы [ 4 ]

1 голос
/ 05 июля 2011
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 голосов
/ 04 июля 2011

Это должно работать:

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 голосов
/ 04 июля 2011

Я понимаю второе group_by, но первое, я думаю, что это будет логика модели, поэтому, в зависимости от типа вашего отношения, вы можете использовать в своей модели параметры: :uniq => true или :group => 'foreign_key_id'.Вы можете прочитать это здесь http://guides.rubyonrails.org/association_basics.html

0 голосов
/ 04 июля 2011

может быть

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

Хэш не поддерживает инъекцию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...