объем рельсов "expires_within" - PullRequest
1 голос
/ 20 февраля 2011

Привет, ребята.У меня есть модель, Item, для которой установлено значение "expire" в created_at + 100.days.Я пытаюсь создать область, которая будет возвращать элементы, срок действия которых истекает в указанное время, например 10.days.

Пока у меня есть это:

scope :expires_within, lambda {|time| where("created_at > ?", time)}

Так что яможет в конечном итоге сделать что-то вроде:

Item.expires_within(10.days)

, который вернет коллекцию предметов, срок действия которых истекает в течение 10 дней.

Это неправильно, я просто хотел получить скелет того, что ядолжен иметь.Я не могу понять, возможно ли сделать это через область или нет.Мне кажется, что я мог бы это сделать, если бы в таблице был столбец с именем expires_at, но проблема в том, что я бы не хотел создавать такой столбец, потому что я хочу, чтобы время истечения, указанное выше как created_at + 100.daysчтобы быть гибким.

Я просто хотел посмотреть, будет ли это возможно без такой колонки, или если это можно сделать, но не с помощью области, я хотел бы также услышать эту возможность.Если нет, я добавлю это.

Ответы [ 3 ]

2 голосов
/ 20 февраля 2011

from_now сделает это:

10.days.from_now

Или динамически:

scope :expires_within, lambda {|time| where("created_at > ?", time.from_now)}
0 голосов
/ 20 февраля 2011

Я придумала решение, которому верю. Я буду продолжать проверять это.

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)}
0 голосов
/ 20 февраля 2011

Вы можете создать область для ...

scope :expires_within_10_days, lambda { where('created at > ?', 90.days.ago) }

..., которая должна извлечь все элементы, созданные более 90 дней назад, что означает, что срок их действия истекает в течение 10 дней.Добавьте еще одно условие, чтобы исключить элементы, срок действия которых уже истек.

Обновление: пример переключен на область вместо обычного запроса AR ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...