1

У меня две модели: employee и in_outs. связь между ними: employeehas manyin_outs и in_outbelongs toemployee .i хочу показать attendance всего employees. Для этого мой current logic - это.Каков наилучший способ запроса?

логика в действии контроллера:

def view_all_employee_attendance 
    employees = Employee.all 
    @all_employess_punch_in_outs = [] 
    employees.each do |employee| 
    @all_employess_punch_in_outs << employee.in_outs.where('date >= ? and date <= ?', Date.today.at_beginning_of_month, Date.today) 
    end 
end 

и ввиду:

 <tbody> 
     <% @all_employess_punch_in_outs.each do |punch_record| %> 
      <tr> 
      <td><%= punch_record.employee.name %></td> 
      <td><%= punch_record.check_in %></td> 
      <td><%= punch_record.check_out %></td> 
      </tr> 
     <% end %> 
     </tbody> 

в этом случае в моем viewqueries снова выполняются. как сделать этот запрос optimise в view и в action с помощью eagerloading?

+0

У вашего вопроса есть некоторые проблемы с форматированием кода. – meshpi

ответ

0

измените строку запроса на это. Это будет загружать все ваши in_outs с предложением where, чтобы вы просто запускали один запрос. Это сделает так, чтобы ваше представление было оптимизировано, а также не нужно запускать N+1 запросов каждый раз при каждом запросе in_out

employees = Employee.joins(:in_outs).all.where('in_outs.date >= ? and in_outs.date <= ?', Date.today.at_beginning_of_month, Date.today).preload(:in_outs) 
+0

Дата относится к модели 'in_outs', поэтому вы должны указать дату с' in_outs.date> =? ' – meshpi

+0

Хорошо, спасибо! –

+0

Получение ошибки: ActiveRecord :: StatementInvalid at/attendance/view_attendance Mysql2 :: Ошибка: Неизвестный столбец 'in_outs.date' в 'where clause': SELECT 'employees'. * FROM' employees' WHERE (in_outs.date> = '2016-10-01' и in_outs.date <= '2016-10-24') – John

1

Ваш запрос снова вызывается по следующей строке: punch_record.employee.name.

Для нетерпеливого нагрузки employee вам нужно изменить ваш запрос будет выглядеть примерно так:

def view_all_employee_attendence 
    @employee_in_outs = Employee.all.includes(:in_outs).where('in_outs.date >= ? and in_outs.date <= ?', Date.today.at_beginning_of_month, Date.today) 
end 

includesdocumentation.

+1

Думайте, что у вас есть опечатка здесь 'include' должно быть' includes' –

+0

Спасибо @CdotStrifeVII Я внес изменения! – meshpi

+0

может быть глупым вопросом, но зачем использовать 'all'? Не будет 'where (...). Include (: in_outs)' иметь тот же эффект? – jaydel

Смежные вопросы