Прошу прощения, если задаю вопрос плохо. У меня есть приложение Rails 3.1 с моделями (упрощенно), например так:
class Employee < ActiveRecord::Base
has_many :merged_children, :class_name => 'Employee', :foreign_key => "merge_parent_id"
has_many :timesheets
def total_time
merged_children.timesheets.in_range(range).hours_minutes.sum
end
end
class Timesheet < ActiveRecord::Base
belongs_to :employee
def in_range(range)
# filter records based on transaction_date in range
end
def hours_minutes
(hours + minutes/60.0).to_f
end
end
Примечание. По сути, метод in_range действует как область действия, а hours_minutes - это расчет. Часы_минуты действительны для каждой записи расписания в результирующем наборе данных, а затем total_time должен суммировать эти значения и возвращать сумму.
Метод total_time не работает, поскольку employee.merged_children возвращает массив, а табели рабочего времени предназначены для работы с одним объектом Employee.
Есть ли способ структурировать "total_time" так, чтобы он по-прежнему отправлял один запрос к БД? Кажется нелегким перебирать массив merged_children, выполняя запрос для каждого. Не уверен, что прямой вызов за столом Арела поможет или повредит, но я открыт для идей.
Если мы все сделаем правильно, результирующий SQL должен выглядеть примерно так:
SELECT sum(hours + minutes/60.0)
FROM employees e1 join employees e2 on e1.id = e2.merge_parent_id join timesheets t on t.employee_id = e2.id
WHERE e1.id = [@employee.id] and t.transaction_date BETWEEN [@range.begin] and [@range.end]
Большое спасибо!