Я бы сделал это
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
, чтобы сохранить ясность кода, отдельное отношение к коду и следовать принципу единой ответственности.