【问题标题】:Order records through has_many relationship通过 has_many 关系的订单记录
【发布时间】: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"

我的目标是:

  1. 按日期范围过滤事件(例如 2019 年 4 月 5 日至 5 月 10 日)

  2. 按最早事件会话的开始日期对事件进行排序(按最早和最晚排序)。会话数没有限制。

我遇到了以下问题:

  1. 在过滤和排序后显示重复事件(重复事件的数量等于与事件关联的事件会话的数量,因此 3 个事件会话会导致出现 3 个相同的事件)。

  2. 无法使用 .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')

【问题讨论】:

  • 你能展示你的代码有问题吗?
  • 我添加了额外的细节,很抱歉最初缺少它。

标签: ruby-on-rails postgresql


【解决方案1】:

添加到 select 子句甚至 event_sessions 属性以使用 distinct

events = joins(:event_sessions)
         .where(event_sessions: { date_start: date_start..date_end } )
         .order('event_sessions.date_start ASC')
         .select('events.*, event_sessions.*')
         .distinct

【讨论】:

  • 不幸的是,在添加选择之后,订单搞砸了,不再基于 event_sessions 上的 date_start。另外还有重复记录。
  • 奇怪,我试过这个。您确定您的代码中没有其他内容吗?
  • 我将代码缩减为: events = joins(:event_sessions) .order('event_sessions.date_start ASC') .select('events.*, event_sessions.*') .distinct return events - - 它仍然无法正常工作。
  • select('events.*, event_sessions.date_start') 允许订单工作,但仍有重复的 .distinct 没有删除
  • 最后下单了吗?
【解决方案2】:

我发现了一些有用的东西:

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')

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多