Class Event
has_many event_sessions
Class EventSessions
belongs_to event
Event Sessions table:
t.integer "event_id"
t.datetime "date_start"
t.datetime "date_end"
Моя цель:
Фильтрация событий по диапазону дат (например, 5 апреля - 10 мая 2019 г.)
Упорядочить события по дате начала самого раннего сеанса событий (упорядочение по самым ранним и самым последним).Количество сессий не ограничено.
Я сталкиваюсь со следующими проблемами:
Дублирующиеся события отображаются после фильтрации иупорядочение (количество повторяющихся событий равно количеству сеансов событий, связанных с событием, поэтому в результате трех сеансов событий появляются 3 одинаковых события).
Невозможно использовать.distinct для удаления дубликатов
Я использую postgresql, если это имеет какое-либо значение.
Это мой текущий код:
events = joins(:event_sessions)
.where(event_sessions: { date_start: date_start..date_end } )
.order('event_sessions.date_start ASC')
Iпри попытке использовать .distinct возникает следующая ошибка:
PG :: InvalidColumnReference: ERROR: для SELECT DISTINCT в списке выбора должны появляться выражения ORDER BY
Кроме того, я не могу использовать.uniq, потому что он не работает с .paginate (.uniq преобразует его в массив).
Я нашел решение (благодаря Rails - Различное включение послеприсоединиться ):
join_query = EventSession.select("event_id, min(date_start) as date").group(1)
events = Event.joins("INNER JOIN (#{join_query.to_sql}) as unique_event_sessions ON events.id = unique_event_sessions.event_id")
.where("date >= ?", date_start).where("date <= ?", date_end)
.order('date ASC')