2015-01-19 2 views
0

В группе Google я добавил свой вопрос: here infact!ActiveRecord OUTER JOIN

Мой вопрос заключается в том, чтобы выразить это внешнее объединение «путь Rails»:

SELECT 
`employees`.`id` AS t0_r0, `employees`.`name` AS t0_r1, `employees`.`last_seen` AS t0_r2, `employees`.`created_at` AS t0_r3, `employees`.`updated_at` AS t0_r4, `employees`.`punch_clock_id` AS t0_r5, `employees`.`account_id` AS t0_r6, `employees`.`born_at` AS t0_r7, `entrances`.`id` AS t1_r0, `entrances`.`employee_id` AS t1_r1, `entrances`.`clocked_at` AS t1_r2, `entrances`.`created_at` AS t1_r3, `entrances`.`updated_at` AS t1_r4, `entrances`.`entrance_type` AS t1_r5 
FROM 
    `employees` 
LEFT OUTER JOIN 
    `entrances` ON `entrances`.`employee_id` = `employees`.`id` AND (`entrances`.`clocked_at` BETWEEN '2015-01-01' AND '2015-01-31’) 
WHERE 
    `employees`.`account_id` = 2 

Мой первый дубль был:

current_user.account.employees.includes(:entrances).where('entrances.clocked_at' => @month_range) 

но это только обеспечивает для сотрудников с входами (если не я потерять «где» часть заявления, и в этом случае я получаю всех сотрудников (и все входы в 250K !!!)

+0

спасибо @xlembouras за редактирование моего вопроса, чтобы представить инструкцию SELECT надлежащим образом! Пытался изо всех сил, но редактор не позволил мне «обрезать» заявление правильной ударной могилой - например, помощь дала мне указание :( –

ответ

0

Если вы хотите включить employees без entrances, вам нужно будет явно включить этот случай в ваш оператор where, вызвав entrances.id IS NULL.

current_user.account.employees.includes(:entrances).where('entrances.id IS NULL OR entrances.clocked_at = ?', @month_range) 

Это последняя часть может немного отличаться в зависимости от того, что @month_range содержит.

+0

жаль, что я не ответил :( , но ваше предложение не компилируется, я испуган 'ActiveRecord :: StatementInvalid: Mysql2 :: Ошибка: Неизвестный столбец 'entrances.id' в 'where clause': SELECT' employees'. * FROM 'employees' WHERE' employees'.'account_id' = 2 AND (входы .id IS NULL ИЛИ entrances.clocked_at = '2015-02-18') ' –