2016-02-05 4 views
0

Я попытался найти это в google и здесь, но, похоже, я не могу найти достойный ответ здесь, проблема , что я хочу, я хочу, мне нужно получить сумму от общего количества часов на каждый день с понедельника по воскресенье, отображающих как этот please check this imageКак сгруппировать по дате и суммировать в ruby ​​on rails

и моей модели подобна этой

class Staff < ActiveRecord::Base 
    has_many :task_logs 
end 

class Client < ActiveRecord::Base 
    has_many :task_logs 
end 

class TaskLog < ActiveRecord::Base 
belongs_to :staff 
belongs_to :client 
end 

и мой контроллер

@hrs_staff_by_client = TaskLog.joins(:staff).joins(:client).joins(:user).select("staffs.full_name AS full_names").select("staffs.position AS positions").select("clients.full_name AS client_names").select("users.email AS emails").select("clients.*, SUM(task_logs.total_hrs) AS today").group("staffs.id, users.id, clients.id") 
+0

Какова связь между пользователями и TaskLog? Является ли TaskLog только одним днем ​​по дизайну? – max

+0

пользователь имеет много журналов задач –

+0

, вы должны отредактировать свой вопрос, чтобы читатели могли это видеть. – max

ответ

0

В идеале, мы будем группировать данные по названиям дней недели TaskLog:

Staff 
    .joins(:task_logs) 
    .group("GROUP BY to_char(task_logs.created_at, 'dy'), staffs.id") 
    .select("SUM(task_logs.total_hrs) AS sum_total_hrs, staffs.id AS staff_id, to_char(task_logs.created_at, 'dy') AS day_string") 

Результат выше запроса будет: (например)

sum_total_hrs | staff_id | day_string 
---------------+----------+----------- 
     50  |  1 | fri 
     45  |  1 | sat 
     20  |  2 | sat 

Сверху вы можете снова присоединиться к Staff и другим таблицам, чтобы получить все необходимые столбцы, например:

temp_sql = Staff 
     .joins(task_logs) 
     .group("GROUP BY to_char(task_logs.created_at, 'dy'), staffs.id") 
     .select('SUM(task_logs.total_hrs) AS sum_total_hrs, staffs.id AS staff_id, to_char(task_logs.created_at, 'dy') AS day_string').to_sql 

Staff.joins(task_logs: :client) 
    .joins("JOIN (#{temp_sql}) AS temp ON temp.staff_id = staffs.id") 
+0

результат должен быть примерно таким Полное имя | Должность | Имя клиента | Время работало на неделю | Понедельник \t Вторник \t Суббота \t Четверг \t Пятница \t Суббота \t Воскресенье –