【问题标题】:Activerecord query with condition on following record带有以下记录条件的 Activerecord 查询
【发布时间】:2020-06-20 01:48:21
【问题描述】:

我有一个Event 模型,带有一个starts 属性作为开始日期。一个事件在下一个事件开始时结束(最后一个事件无限期地进行)。我想要一个查询,它返回从包含给定日期dd 的事件开始的事件:

Event.since(Date.today)

应该返回当前事件和后面的事件。

我可以通过两个查询轻松做到这一点:

first=Event.where(starts: -Float::INFINITY..Date.today).order(starts: :asc).last
Event.where(starts: first.starts..Float::INFINITY)

但是有什么更有效的方法吗?

这是postgresql,以防万一

【问题讨论】:

  • 你能分享一下架构吗?输入和预期输出是什么?
  • 您可以添加一个示例以便更好地理解吗?
  • 对不起,我用一个例子和更多细节改写了它

标签: ruby-on-rails postgresql activerecord arel


【解决方案1】:
class Event < ApplicationRecord
  # @see https://devhints.io/arel
  def self.after(time = Time.current)
    col = arel_table[:starts]
    sub_query = arel_table.project(col)
                          .where(col.lt(time))
                          .order(col.asc)
                          .take(1)
    where(col.gt(sub_query))
  end
end

这会在 where 子句中生成一个子查询:

SELECT "events".* FROM "events" 
WHERE "events"."starts" > (SELECT "events"."starts" FROM "events" WHERE "events"."starts" < '2020-03-08 17:32:16.602529' ORDER BY "events"."starts" ASC LIMIT 1) LIMIT $1 

【讨论】:

  • 谢谢!这实际上会比单独运行两个查询更有效吗?
  • 这是您可以进行基准测试的东西。我猜是的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-17
相关资源
最近更新 更多