Как извлечь общие named_scopes из моделей ActiveRecord

У меня есть named_scope, который повторно используется в нескольких моделях ActiveRecord. Например:

  named_scope :limit, lambda {|limit| {:limit => limit}}    

Как лучше всего извлечь этот код для совместного использования между моделями. Можно ли извлечь его в модуль или лучше заново открыть класс ActiveRecord :: Base?


person Bartosz Blimke    schedule 09.10.2008    source источник


Ответы (2)


Используйте модуль. Примерно так должно работать:

module CommonScopes
  def self.included(base)
    base.class_eval do
      named_scope :limit, lambda {|limit| {:limit => limit}}
    end
  end
end

Затем просто включите CommonScopes, и все будет хорошо.

person Ben Scofield    schedule 09.10.2008
comment
Кажется, это работает на уровне класса, но не на уровне экземпляра. Например: User.limit(1) работает, но второй вызов ограничения здесь вызывает ошибку: users=User.limit(5); users.limit(1). Любое решение для уровня экземпляра? - person Matt Huggins; 18.04.2011

@Matt через instance_eval, @see Общие области видимости через модуль?

person Hugo Stieglitz    schedule 17.10.2012