【问题标题】:Join with where clause that filters out specific records, rails active record加入过滤掉特定记录的 where 子句,rails 活动记录
【发布时间】:2016-08-09 07:44:24
【问题描述】:

我正在制作一个包含联赛和赛事的体育应用程序,赛事包含league_id,联赛有namecountry_name。我怎样才能得到今天开始日期的所有事件以及联赛名称和国家。

我试过了:

League.joins(:events).where(events: {event_start: Time.zone.now..Time.zone.now.end_of_day})

但这会返回今天有赛事的所有联赛,然后当我尝试访问该特定联赛的赛事时,所有赛事都包括在内,而不仅仅是今天正在进行的赛事。

【问题讨论】:

    标签: ruby-on-rails ruby sqlite activerecord


    【解决方案1】:

    Events 开头并包含相关的League 以避免N+1 问题。

    Event.includes(:league).where(event_start: Time.zone.now..Time.zone.now.end_of_day)
    

    【讨论】:

    • 这行得通,谢谢!但问题是我现在不能迭代我想要的层次结构(迭代联赛,而不是事件)我只是写了以下内容来解决这个问题:events = Event.includes(:league).where(event_start: Time.zone.now..Time.zone.now.end_of_day) events_hash = {} events.each do |event| events_hash[event.league.group] ||= {} events_hash[event.league.group][event.league.name] ||= [] events_hash[event.league.group][event.league.name] << event end events_hash 有没有更明显的更优雅的方法来做到这一点? (对不起格式)
    【解决方案2】:

    要获取今天开始日期的所有事件,我认为您需要在 begin_of_day 到 end_of_day 之间进行搜索

    Event.includes(:league).where(event_start: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
    

    Event.includes(:league).where("event_start >= ? && event_start <= ?", Time.zone.now.beginning_of_day, Time.zone.now.end_of_day)
    

    【讨论】:

      猜你喜欢
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多