您可以通过以下方式获得连续报价:
Quote.order(:id).offset(0).first
Quote.order(:id).offset(1).first
Quote.order(:id).offset(2).first
# ...
要获得当天的报价,您可以使用Date#jd,它返回日期的Julian day:
Date.parse('2020-06-01').jd #=> 2459002
Date.parse('2020-06-02').jd #=> 2459003
Date.parse('2020-06-03').jd #=> 2459004
由于您(可能)没有那么多引号,因此需要将此值转换为我们可以传递给offset 的值,即介于 0 和引号总数之间的值。这就是模运算符 % 可以提供帮助的地方——它只返回那个,在最后循环:(例如,对于 22 个引号)
Date.parse('2020-06-01').jd % 22 #=> 18
Date.parse('2020-06-02').jd % 22 #=> 19
Date.parse('2020-06-03').jd % 22 #=> 20
Date.parse('2020-06-04').jd % 22 #=> 21
Date.parse('2020-06-05').jd % 22 #=> 0
Date.parse('2020-06-06').jd % 22 #=> 1
把它们放在一起:
require 'date'
def quote_of_the_day(date = Date.current)
offset = date.jd % Quote.count
Quote.order(:id).offset(offset).first
end
请注意,这会运行两个查询:一个获取报价总数,另一个获取给定日期的报价。您可能想要缓存结果。
还要注意,添加新引号可能会产生意想不到的结果,因为模运算会返回完全不同的偏移量:
Date.parse('2020-06-03').jd % 22 #=> 20
# after adding a new Quote
Date.parse('2020-06-03').jd % 23 #=> 5
您可以通过相应地调整 jd 结果来弥补这一点:
ADJUSTMENT = 15
(Date.parse('2020-06-03').jd + ADJUSTMENT) % 23 #=> 20