在 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 迁移中处理过长的索引名称?

与 Ruby on Rails 相关的 ORM 是啥?

如何在 Ruby on Rails 迁移中使列唯一并为其编制索引?

Ruby on Rails 在现有资源上返回 404

JOIN在rails上查询ruby