агрегация данных рельсов - PullRequest
0 голосов
/ 18 мая 2010

Я должен создать хеш-форму вида h [: bill] => ["Billy", "NA", 20, "PROJ_A"] по логину, где 20 - общее количество часов, сообщенное логином для всех транзакции задачи, возвращаемые запросом, где каждый логин имеет несколько зарегистрированных транзакций. Я сделал это плохо или это кажется нормальным.

h = Hash.new
Task.find_each(:include => [:user], :joins => :user, :conditions => ["from_date >= ? AND from_date <= ? AND category = ?", Date.today - 30, Date.today + 30, 'PROJ1']) do |t|

   h[t.login.intern] = [t.user.name, 'NA', h[t.login.intern].nil? ? (t.hrs_per_day * t.num_days) : h[t.login.intern][2] + (t.hrs_day * t.workdays), t.category]

end

Кроме того, если мне нужно агрегировать эти данные не только по логину, но по логину и категории, как мне это сделать?

спасибо, пепел

1 Ответ

2 голосов
/ 18 мая 2010

Я бы сделал это

h[:bill] => ["Billy", "NA", 20, "PROJ_A"]

хеш вроде так

{ :user => t.user.name, :your_key_name => 'NA', :cumulative_hours => 20, :category => 'PROJ_A' }

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

Чтобы получить доступ к данным по пользователю и категории, вы можете сделать что-то вроде этого

user_hash = {}

Task.find_each(:include => [:user], :joins => :user, :conditions => ["from_date >= ? AND from_date <= ? AND category = ?", Date.today - 30, Date.today + 30, 'PROJ1']) do |task|

  user_hash[task.login.intern] ||= {}
  user_hash[task.login.intern][task.category] = { :user => task.user.name, :your_key_name => 'NA', :cumulative_hours => cumulative_hours(user_hash, task), :category => task.category }

end


def cumulative_hours(user_hash, task)
  if user_hash[task.login.intern] && user_hash[task.login.intern][task.category]
    return user_hash[task.login.intern][task.category][:cumulative_hours] + (task.hrs_day * task.workdays)
  else
    return task.hrs_per_day * task.num_days
  end
 end

Для удобства чтения я добавил значимые имена переменных, а также создал метод для вычисления cumulative_hours, чтобы сохранить ясность кода, отдельное отношение к коду и следовать принципу единой ответственности.

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