通过has_many关系的订单记录

时间:2019-03-19 17:00:47

标签: ruby-on-rails postgresql

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. p>
  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:错误:对于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')

2 个答案:

答案 0 :(得分:0)

甚至将event_sessions属性添加到select子句中,以使用不同的

>msbuild helloworld.csproj -t:Build.

答案 1 :(得分:0)

我发现了一些可行的方法:

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')
相关问题