У меня есть таблица с именем acts
, и я хочу запустить запрос, который обновляет значения act в течение целой недели. Я хотел бы убедиться, что запрос всегда возвращает одну строку для каждого дня недели, даже если в этот день нет записей. Сейчас я делаю это так:Rails с именем scope для левой объединенной модели
def self.this_week_totals
sunday = Time.now.beginning_of_week(:sunday).strftime("%Y-%m-%d")
connection.select_values(<<-EOQ)
SELECT COALESCE(SUM(end_time - start_time), '0:00:00') AS total_time
FROM generate_series(0, 6) AS s(t)
LEFT JOIN acts
ON acts.day = '#{sunday}'::date + s.t
WHERE deleted_at IS NULL
GROUP BY s.t
ORDER BY s.t
EOQ
end
Есть ли какой-нибудь способ, которым я мог бы сделать это именованный от класса Act, поэтому он может быть объединен с другими условиями, например, для фильтрации актов по client_id
? Поскольку acts
не находится в моем FROM
, но является частью LEFT JOIN
, я предполагаю, что нет, но, возможно, кто-то там знает способ.
Редактировать: Чтобы уточнить, цель в этом методе всегда возвращает ровно 7 объектов закона, независимо от того, что находится в базе данных.
На самом деле, если вы сделаете ПРАВОЕ СОЕДИНЕНИЕ, оно работает! Я всегда игнорировал ПРАВИЛЬНЫЕ СОЕДИНЕНИЯ, так как они тривиальны для повторной записи как LEFT JOINs, но вот случай, когда мне это нужно. Если вы отредактируете свой ответ, я приму его. :-) –
обновлено до RIGHT JOIN – house9
Хм, одно предостережение с этим подходом заключается в том, что если я добавлю еще одно соединение, скажем в таблицу 'clients', строки начнут исчезать. Это связано с тем, что я присоединяюсь к «клиентам», где «clients.id = acts.client_id», а RIGHT JOIN делает «client_id» NULL, поэтому сравнение является ложным. Это не проблема, когда первичная таблица является 'generate_series', и я LEFT JOINING для подзапроса, который объединяет' act' и 'clients'. Я не уверен, как использовать INNER JOIN для клиентов, в то время как RIGHT JOINING - для генерации_серий, и все равно всегда получается 7 строк. –