В Rails 3.1 для данной модели:
class Subscripion < ActiveRecord::Base
scope :active, lambda {
where("start_date is not ? AND end_date >= ?", nil, Date.today)
}
def active?
self.class.active.exists?(self)
end
end
Пока что это самое сухое решение, о котором я мог подумать, поскольку оно не повторяет условия в методе active?
.
Однако есть два недостатка:
- При наличии экземпляра подписки запрос базы данных для определения его активности не требуется.Мы можем проверить это по его атрибутам:
!start_date.nil? && end_date >= Date.today
.Вызов exists?
приводит к дополнительному запросу к базе данных. - Если исходный экземпляр подписки был изменен до вызова
exists?
в области действия active
, результат будет не тем, что мы хотим, потому что exists?
игнорирует экземпляр и напрямую запрашивает базу данных.
Есть идеи о лучших решениях, которые все еще определяют условия в одном месте?