Ruby 或 Rails 查找日期为 "two months from now" 的记录

Ruby or Rails find records dated "two months from now"

我正在尝试查找距 "now" 大约 2 个月的给定月份中的所有记录——现在是任务 运行 的时间。例如...如果任务 运行 是 2 月 1 日,它应该找到所有在 4 月到期的记录。但是,如果任务 运行s 是 2 月 4 日,它也应该只查找所有在 4 月到期的记录(包括 4 月 1 日、2 日、3 日等)。

我可以让下面的查询工作(我正在为此任务设置每月的 cron 作业)......除了在 11 月或 12 月 运行 时它不起作用。

def expiring_soon 

future_date = Date.today + 30.days
first_date = Date.new(future_date.year, future_date.month, 1)
last_date = Date.new(future_date.year, future_date.month + 1.month) - 1.day
@expiring = SampleRecord.expires_between(first_date, last_date)

我觉得必须有更好的方法....我正在使用 Rails 4 和 Postgres

看来您想要这样的东西。使用 first_date 作为 last_date

的起点
future_date = Date.today + 30.days
first_date = Date.new(future_date.year, future_date.month, 1)
last_date = first_date.end_of_month # i.e. return 23:59:59 Dec 31st

假设您的 Job 模型中有 run_at 字段,SampleRecord 模型中有 expires_at 字段。所以对于特定的 job 你可以这样做:

SampleRecord.where("expires_at BETWEEN ? AND ?", job.run_at, job.run_at + 2.months)

您可以将以下 scope 添加到您的模型中:

scope :expiring_soon, -> {
  date = Date.today >> 1
  where(expires_at: (date.beginning_of_month..date.end_of_month))
}

然后像这样调用作用域:

YourModel.expiring_soon

您可能想在 Rails 中阅读有关 Date/Time calculations and Range queries (see 2.3.2) 的内容。