2 уровня глубокая группировка в рубине - PullRequest
2 голосов
/ 11 февраля 2011

Итак, у меня есть массив записей, и я хотел бы сгруппировать по 2 уровням

По сути, я хотел бы group_by{|x| x.field1 }, а затем каждое значение в хэше будет далее сгруппировано по field2.Эффективно приводя к дереву, которое я могу выгрузить.

def treemaker(array = [])
  tree = ledgers.group_by{|x|x.master_group}
  tree.each{|x,z| tree[x] = z.group_by{|y| y.account_group}}
  tree
end

Я бы тогда рендерил дерево таким образом, чтобы его можно было вставить в плагин "tree" javascript.

Есть либолее эффективный способ?

Пример ввода: Массив объектов ActiveRecord, в котором содержится модель, поля master_group, account_group и name

Class MyModel < ActiveRecord::Base
  validates :master_group, :account_group, :name, :presence => true
end

Образец выхода:

{"master_group1" => {"account_group1" => ["name1","name2",...], 
                     "account_groupx" => ["name3", "name4",...],
                     ....}, 
 "master_group2" => {"account_group2" => ["namex", "namey"]},
 ...
}

Я специально не ищу решение «группировки SQL» (но это тоже было бы неплохо).Просто решение с использованием перечислимых в любом заданном списке объектов ruby.

Ответы [ 2 ]

3 голосов
/ 12 февраля 2011

@ xaxxon отправил меня в правильном направлении, в основном с путем «значение по умолчанию хэша».

Я думаю, что теперь я могу добавить метод в мою модель, где я могу использовать все виды областей и тэковна дереве в конце, чтобы получить мои модели в режиме дерева.

class MyModel < ActiveRecord::Base

  validates :master_group, :account_group, :name, :presence => true
  def self.tree(field1 = 'master_group', field2 = 'account_group')
    tree = Hash.new{|hash,key| hash[key] = Hash.new{|h,k| h[k] = []}}
    all.each do |item|
      tree[item.send('field1')][item.send('field2')].push(item)
    end
    tree # bob's your uncle!
  end

end

MyModel.recent.tree => Hash of Hash of arrays
1 голос
/ 12 февраля 2011

настроить некоторые поддельные данные

foo = [{: a => 1,: b => 2}, {: a => 3,: b => 4}]

настроить структуру выходных данных

tree = {}

заполнить структуру выходных данных - это странно, потому что вы должны заполнитьхэши, которые не существуют, когда они не существуют, следовательно, || = {} материал.

foo.each {| thing |(tree [thing [: a]] || = {}) [thing [: b]] = вещь}

выглядит хорошо ..: a - ваша основная группа, а: b - ваша account_group

pp tree

{1 => {2 => {: a => 1,: b => 2}}, 3 => {4 => {: a=> 3,: b => 4}}}

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