Отображение результата двух группировок для двухмерного объекта в рельсах - PullRequest
1 голос
/ 14 февраля 2020

У меня есть модель, которую я хотел бы сгруппировать по 2 столбцам:

ModelName.group(:location_id, :referrer).count

В результате получается объект, с которым трудно иметь дело:

{
    [ '1', 'friend' ] => 100,
    [ '1', 'family' ] => 23,
    [ '2', 'friend' ] => 43,
    [ '2', 'family' ] => 65
}

Я хотел бы сопоставить эти значения с более легкой структурой, но я не могу заставить ее работать. В идеале это было бы что-то вроде:

{
    '1' => {
        'friend' => 100
        'family' => 23
    },
    '2' => {
        'friend' => 100
        'family' => 23
    }
}

Как я могу выполнить sh (желательно, чтобы оно работало и с третьим измерением)?

Ответы [ 2 ]

2 голосов
/ 14 февраля 2020

Вы можете взять свой текущий вывод и сгруппировать его по каждой клавише ha sh, а затем преобразовать значения ha sh:

data.group_by { |key, _| key.first }
    .transform_values do |values|
      values.each_with_object({}) do |(keys, value), hash|
        hash[keys.last] = value
      end
    end
# {"1"=>{"friend"=>100, "family"=>23}, "2"=>{"friend"=>43, "family"=>65}}
0 голосов
/ 14 февраля 2020

Дано:

original = {
  [ '1', 'friend' ] => 100,
  [ '1', 'family' ] => 23,
  [ '2', 'friend' ] => 43,
  [ '2', 'family' ] => 65
}

Вы можете легко добраться туда, комбинируя авививификацию га sh:

desired = Hash.new { |h, k| h[k] = { } }

и некоторые вложенные разрушения:

original.each_with_object(desired) do |((loc, ref), n), h|
  h[loc][ref] = n
end
desired
# {"1"=>{"friend"=>100, "family"=>23}, "2"=>{"friend"=>43, "family"=>65}}

Или, если вам не нравится предварительный клик desired:

desired = original.each_with_object(Hash.new { |h, k| h[k] = { } }) do |((loc, ref), n), h|
  h[loc][ref] = n
end
# {"1"=>{"friend"=>100, "family"=>23}, "2"=>{"friend"=>43, "family"=>65}}

или, возможно,

reorg   = ->(((loc, ref), n), h) { h[loc][ref] = n }
desired = original.each_with_object(Hash.new { |h, k| h[k] = { } }, &reorg)
# {"1"=>{"friend"=>100, "family"=>23}, "2"=>{"friend"=>43, "family"=>65}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...