在 Rails 上使用唯一 id ruby 映射日期
Posted
技术标签:
【中文标题】在 Rails 上使用唯一 id ruby 映射日期【英文标题】:mapping date with unique id ruby on rails 【发布时间】:2020-09-22 02:56:12 【问题描述】:我想写一个动作,我可以每天从 DB 返回一个报价。我的数据库是这样的
|id|quote|
所以,如果我今天调用此操作,它应该全天返回相同的报价,但明天它应该从数据库返回另一个报价。我想过将报价 ID 映射到今天的日期,但不知道该怎么做。
【问题讨论】:
欢迎来到 SO。你的问题问得不好。请参阅“How to Ask”、“Stack Overflow question checklist”及其所有链接页面。您向我们提出了要求,但没有表现出自己解决问题的任何努力,这告诉我们您希望我们为您编写代码,而不是帮助您修复您编写的代码,这是题外话。 【参考方案1】:您可以通过以下方式获得连续报价:
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
【讨论】:
以上是关于在 Rails 上使用唯一 id ruby 映射日期的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ruby on rails 中使每个 user_id 的列数据唯一
如何在 Ruby on Rails ActiveRecord 迁移中处理过长的索引名称?