Сложное левое внешнее самосоединение в Rails 5 - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть таблица 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...