У меня есть таблица list_events
, где я хочу получить последнее событие для каждого пользователя в списке за определенное время. Вот пример таблицы.
id user_id list_id event created_at
1 5 1 sub 13:45
2 1 1 sub 14:01
3 1 2 sub 14:02
4 3 1 sub 14:03
5 4 1 sub 14:04
6 1 1 unsub 14:05
Последние события для пользователя в списке 1 с 14:00 до 15:00 будут ...
id user_id list_id event created_at
4 3 1 sub 14:03
5 4 1 sub 14:04
6 1 1 unsub 14:05
В моей модели Rails 5 я написал такой запрос:
list.events
.joins("
left outer join list_events b
on list_events.user_id = b.user_id
and list_events.list_id = b.list_id
and list_events.created_at < b.created_at
")
.where("b.user_id is null")
.where(created_at: start..end)
Это прекрасно работает, но мне интересно, есть ли способ написать это без ручного кодирования соединения. Я заметил, что в Rails есть метод left_outer_join
, но нет способа указать пользовательский on
. Возможно с belongs_to
?
Также, если есть путь к псевдониму list_events
как a
, но при этом можно использовать преимущества абстракции list.events
.