【发布时间】:2021-07-10 22:50:09
【问题描述】:
我正在尝试创建一个查看模型关联记录的 starts_at 日期时间的高性能范围,并获取关联记录在该窗口内的对象。
例如:
class Championship < ApplicationRecord
has_many :races
end
class Race < ApplicationRecord
belongs_to :championship
end
每个Race 记录都有一个starts_at 时间戳。我需要查看每个Championship 的比赛,按starts_at 排序这些比赛,获取第一个(按时间顺序)并检查我们是否已经过去,然后获取最后一个并检查我们是否在那个时间之前时间。
class Championship < ApplicationRecord
scope :active, -> { joins(:races)...? }
但我真的不确定如何在 SQL 中对这些记录进行排序并获取第一条或最后一条记录以进行评估。
更新(澄清)
c = Championship.create()
r1 = c.races.create(starts_at: '2021-05-01')
r2 = c.races.create(starts_at: '2021-06-01')
r3 = c.races.create(starts_at: '2021-07-01')
r4 = c.races.create(starts_at: '2021-08-01')
假设当前时间是:
- 04/01/21:冠军应该不是
active - 05/01/21: 冠军应该是
active - 05/15/21: 冠军应该是
active - 08/15/21:冠军应该不是
active
更新(分辨率) 这是我们最终得到的结果:
scope :active, -> { where(id: Race.select(:championship_id).group(:championship_id).having("MIN(races.starts_at) - interval '1 day' < ?", Time.now).having("MAX(races.starts_at) + interval '2 days' > ?", Time.now).pluck(:championship_id)) }
【问题讨论】:
标签: sql ruby-on-rails