【问题标题】:Fusion of two queries in active record rails在活动记录轨道中融合两个查询
【发布时间】:2016-11-06 17:21:57
【问题描述】:

如何在 Rails 5 中合并这两个查询?

Event
.where(starts_at: date.beginning_of_day..date.end_of_day)
.where(kind: "opening")

Event.where("cast(strftime('%w', starts_at) as int) = ?", date.wday)
.where(kind: "opening")
.where(weekly_recurring: true)

我需要在一个查询中处理所有这些事件以提高性能。

感谢您的帮助

【问题讨论】:

    标签: sql ruby-on-rails activerecord


    【解决方案1】:

    如果你想合并结果,那么

    Event.where(starts_at: date.beginning_of_day..date.end_of_day).where(kind: "opening").where("cast(strftime('%w', starts_at) as int) = ?", date.wday).where(kind: "opening").where(weekly_recurring: true)
    

    如果您想在一个查询中获得两个单独的结果,我认为活动记录没有这种方法。

    【讨论】:

    • 这不是我需要的 :( 我需要有良好的 begin_of_day 和 end_of_day 的开幕活动和良好的一天(演员(strftime....)。
    【解决方案2】:

    我总是更容易编写复杂的查询,例如直接在 SQL 中需要的查询;比起硬塞进 ActiveRecord,你写起来会更快。

    在你的情况下,我会这样做:

    query = "starts_at between #{date.beginning_of_day} and #{date.end_of_day} 
    and kind = 'opening'
    and weekly_recurring = true
    and cast(strftime('%w', starts_at) as int) = #{date.wday}"
    
    Event.where(query)
    

    我发现这种方法更容易维护。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 1970-01-01
      相关资源
      最近更新 更多