Rails: Is that possible to define named scope in a module?

后端 未结 3 1558
迷失自我
迷失自我 2020-12-14 01:34

Say there are 3 models: A, B, and C. Each of these models has the x attribute.

Is that possible to define a named scope in a module and include this mod

3条回答
  •  失恋的感觉
    2020-12-14 01:46

    As of Rails 3.1 the syntax is simplified a little by ActiveSupport::Concern:

    Now you can do

    require 'active_support/concern'
    
    module M
      extend ActiveSupport::Concern
    
      included do
        scope :disabled, where(:disabled => true)
      end
    
      module ClassMethods
       ...
      end
    end
    

    ActiveSupport::Concern also sweeps in the dependencies of the included module, here is the documentation

    [update, addressing aceofbassgreg's comment]

    The Rails 3.1 and later ActiveSupport::Concern allows an include module's instance methods to be included directly, so that it's not necessary to create an InstanceMethods module inside the included module. Also it's no longer necessary in Rails 3.1 and later to include M::InstanceMethods and extend M::ClassMethods. So we can have simpler code like this:

    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"
    

提交回复
热议问题