Записи заказов через отношение has_many - PullRequest
0 голосов
/ 19 марта 2019
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"

Моя цель:

  1. Фильтрация событий по диапазону дат (например, 5 апреля - 10 мая 2019 г.)

  2. Упорядочить события по дате начала самого раннего сеанса событий (упорядочение по самым ранним и самым последним).Количество сессий не ограничено.

Я сталкиваюсь со следующими проблемами:

  1. Дублирующиеся события отображаются после фильтрации иупорядочение (количество повторяющихся событий равно количеству сеансов событий, связанных с событием, поэтому в результате трех сеансов событий появляются 3 одинаковых события).

  2. Невозможно использовать.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')

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Я нашел то, что сработало:

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')
0 голосов
/ 19 марта 2019

Добавьте к предложению select даже атрибуты event_sessions, чтобы использовать отдельные

events = joins(:event_sessions)
         .where(event_sessions: { date_start: date_start..date_end } )
         .order('event_sessions.date_start ASC')
         .select('events.*, event_sessions.*')
         .distinct
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...