具有以下记录条件的Activerecord查询

问题描述 投票:0回答:1

我有一个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个回答
0
投票
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 
© www.soinside.com 2019 - 2024. All rights reserved.