В моем приложении Rails есть следующие модели:
class Shift < ActiveRecord::Base
has_many :schedules
scope :active, where(:active => true)
end
class Schedule < ActiveRecord::Base
belongs_to :shift
end
Я хочу создать коллекцию всех активных смен и с нетерпением жду загрузки всех связанных расписаний, которые имеют occurs_on
между двумя указанными датами. Если смещение не имеет графиков между этими датами, оно все равно должно быть возвращено в результатах.
По сути, я хочу сгенерировать SQL, эквивалентный:
SELECT shifts.*, schedules.*
FROM shifts
LEFT JOIN schedules ON schedules.shift_id = shifts.id
AND schedules.occurs_on BETWEEN '01/01/2012' AND '01/31/2012'
WHERE shifts.active = 't';
Моя первая попытка была:
Shift.active.includes(:schedules).where("schedules.occurs_on BETWEEN '01/01/2012' AND '01/31/2012')
Проблема состоит в том, что фильтрация происходит_ в выполняется в предложении where, а не в объединении. Если у смены нет расписаний за этот период, она вообще не возвращается.
Моя вторая попытка состояла в том, чтобы использовать метод joins
, но это делает внутреннее соединение. Опять же, это отбросит все смены, у которых нет расписаний на этот период.
Я разочарован, потому что я знаю SQL, который я хочу генерировать AREL, но я не могу понять, как выразить его с помощью API. Кто-нибудь?