СУХОЕ решение для повторного использования условий применения рельсов в других методах? - PullRequest
2 голосов
/ 26 января 2012

В 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?игнорирует экземпляр и напрямую запрашивает базу данных.

Есть идеи о лучших решениях, которые все еще определяют условия в одном месте?

1 Ответ

1 голос
/ 26 января 2012

я считаю активным?Реализация метода не очень хороша, потому что он загрузит все активные подписки, а затем заглянет в список самостоятельно.Лучшим подходом было бы что-то вроде этого:

def active?
  self.class.active.where(id: self.id).present?
end

Эта реализация только проверяет базу данных с помощью запроса COUNT.

В любом случае, я полагаю, что это будет иметь больше смысла для активного?метод с условием, которое вы написали (! start_date.nil? && end_date> = Date.today), потому что это единственный способ отразить реальное состояние текущего экземпляра.

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