2011-01-15 5 views

risposta

44

Sì, è

module Foo 
    def self.included(base) 
    base.class_eval do 
     scope :your_scope, lambda {} 
    end 
    end 
end 
+0

La convalida e la relazione possono essere definite in questo modo? – CantGetANick

+0

Non posso dire 100%, ma non riesco a pensare perché no. –

+0

Yap, e funziona. Grazie per l'esempio. – CantGetANick

29

Come di Rails 3.1 la sintassi è semplificato un po 'per ActiveSupport: : preoccupazione:

ora che è possibile fare

require 'active_support/concern' 

module M 
    extend ActiveSupport::Concern 

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

    module ClassMethods 
    ... 
    end 
end 

ActiveSupport :: Preoccupazione spazza anche nelle dipendenze del modulo incluso, here is the documentation

[aggiornamento, rivolgendosi di aceofbassgreg commento]

The Rails 3.1 e successivamente ActiveSupport :: La preoccupazione permette un include metodi di istanza del modulo da inserire direttamente , in modo che non sia necessario creare un modulo InstanceMethods all'interno del modulo incluso. Inoltre, in Rails 3.1 e versioni successive non è più necessario includere M :: InstanceMethods ed estendere M :: ClassMethods. Così possiamo avere codice più semplice in questo modo:

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

grazie per il collegamento alla documentazione –

+0

Punto di chiarimento: se, nel tuo modello, estendi 'M :: ClassMethods' e includi' M :: InstanceMethods', ti consigliamo di aggiungere la logica 'estendi ActiveSupport :: Concern' nel modulo 'M :: InstanceMethods'. Forse in questo caso Les sta includendo 'M' nel modello (e non ha un modulo' M :: InstanceMethods'?). – aceofbassgreg

-1

Per quanto riguarda Rails 4.x è possibile utilizzare gemma scopes_rails

Può generare scopes di file e includerlo al vostro modello.

Inoltre, può generare automaticamente ambiti per gli stati state_machines.