Rails: возможно ли определить именованную область в модуле? - PullRequest
26 голосов
/ 15 января 2011

Скажем, есть 3 модели: A, B и C. Каждая из этих моделей имеет атрибут x.

Можно ли определить именованную область в модуле и включить этот модуль в A, B и C?

Я попытался сделать это и получил сообщение об ошибке, в котором говорится, что scope не распознано ...

Ответы [ 3 ]

45 голосов
/ 15 января 2011

Да, это

module Foo
  def self.included(base)
    base.class_eval do
      scope :your_scope, lambda {}
    end
  end
end
30 голосов
/ 08 января 2013

Начиная с Rails 3.1, синтаксис немного упрощен ActiveSupport :: Concern:

Теперь вы можете сделать

require 'active_support/concern'

module M
  extend ActiveSupport::Concern

  included do
    scope :disabled, where(:disabled => true)
  end

  module ClassMethods
   ...
  end
end

ActiveSupport :: Концерн также обнаруживает зависимости включенного модуля, вот документация

[обновление, адресованное комментарию aceofbassgreg]

Rails 3.1 и более поздние версии ActiveSupport :: Concern позволяют напрямую включать методы экземпляра включаемого модуля, так что нет необходимости создавать модуль InstanceMethods внутри включенного модуля. Также в Rails 3.1 и более поздних версиях больше нет необходимости включать M :: InstanceMethods и расширять M :: ClassMethods. Таким образом, у нас может быть более простой код, подобный этому:

require 'active_support/concern'
module M
  extend ActiveSupport::Concern
  # foo will be an instance method when M is "include"'d in another class
  def foo
    "bar"
  end

  module ClassMethods
    # the baz method will be included as a class method on any class that "include"s M
    def baz
      "qux"
    end
  end

end

class Test
  # this is all that is required! It's a beautiful thing!
  include M
end

Test.new.foo # ->"bar"
Test.baz # -> "qux"
0 голосов
/ 02 марта 2016

Что касается Rails 4.x, вы можете использовать gem scopes_rails

Может генерировать scopes файл и включать его в вашу модель.

Также он можетавтоматически генерировать области для state_machines состояний.

...