【发布时间】:2019-03-19 17:00:47
【问题描述】:
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"
我的目标是:
按日期范围过滤事件(例如 2019 年 4 月 5 日至 5 月 10 日)
按最早事件会话的开始日期对事件进行排序(按最早和最晚排序)。会话数没有限制。
我遇到了以下问题:
在过滤和排序后显示重复事件(重复事件的数量等于与事件关联的事件会话的数量,因此 3 个事件会话会导致出现 3 个相同的事件)。
无法使用 .distinct 删除重复项
如果这有什么不同,我正在使用 postgresql。
这是我当前的代码:
events = joins(:event_sessions)
.where(event_sessions: { date_start: date_start..date_end } )
.order('event_sessions.date_start ASC')
当我尝试使用 .distinct 时遇到以下错误:
PG::InvalidColumnReference: ERROR: for SELECT DISTINCT, ORDER BY 表达式必须出现在选择列表中
此外,我无法使用 .uniq,因为它不适用于 .paginate(.uniq 将其转换为数组)。
我找到了解决方案(感谢Rails - Distinct ON after a join):
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')
【问题讨论】:
-
你能展示你的代码有问题吗?
-
我添加了额外的细节,很抱歉最初缺少它。