Я придумала решение, которому верю. Я буду продолжать проверять это.
scope :expires_within, lambda {|time| where("created_at < ?", time.from_now - 100.days)}
В основном моя первоначальная формула для расчета истечения срока действия была:
Time.now > created_at + 100.days
Так как я хочу определить, истекает ли что-то в будущем (например, 10.days), я добавляю это в левую часть:
Time.now + time > created_at + 100.days
Помните, что 100.days - это срок, в течение которого предмет должен прожить до истечения срока его действия.
Наконец, я решаю для created_at
, чтобы он сам по себе, поскольку этого требует SQL-запрос, вычитая 100.days
с другой стороны:
created_at < (Time.now + time) - 100.days
Это можно сделать более кратким, как указал Райан, выполнив:
created_at < time.from_now - 100.days
Основная математика, я думаю. Я все еще довольно ошеломлен, думая об этом слишком усердно, поэтому я немного опробую его, чтобы убедиться, что он работает как задумано. В противном случае Item.expires_within(10.days)
должен вернуть коллекцию предметов, срок действия которой истекает в течение 10 дней (или раньше).
РЕДАКТИРОВАТЬ : я реорганизовал это, чтобы игнорировать элементы, которые уже истекли Таким образом, новая область поиска ищет элементы, срок действия которых еще не истек, и срок их действия истекает в течение указанного периода времени:
scope :expires_within, lambda {|time| where("created_at BETWEEN ? AND ?", 100.days.ago, time.from_now - 100.days)}