2011-08-28 8 views
7

En rails3, hago los mismos alcances en el modelo. por ejemplo¿Puedo usar ámbitos ActiveRecord (alcance) comunes con módulo en Rails?

class Common < ActiveRecord::Base 
    scope :recent , order('created_at DESC') 
    scope :before_at , lambda{|at| where("created_at < ?" , at) } 
    scope :after_at , lambda{|at| where("created_at > ?" , at) } 
end 

Quiero dividir los ámbitos comunes en el módulo en lib. Así que intento como este.

module ScopeExtension 
    module Timestamps 
    def self.included(base) 
     base.send :extend, ClassMethods 
    end 

    module ClassMethods 
     scope :recent  , lambda{order('created_at DESC')} 
     scope :before_at , lambda{|at| where("created_at < ?" , at) } 
     scope :after_at , lambda{|at| where("created_at > ?" , at) } 
    end 
end 

y escribo éste

class Common < ActiveRecord::Base 
    include ScopeExtension::Timestamps 
end 

Pero rieles muestran este error.

undefined method `scope' for ScopeExtension::Timestamps::ClassMethods:Module 

(no me olvido biblioteca de carga automática)

¿Cómo puedo reutilizar fácilmente característica común en el alcance registro activo?

Supongo que este problema se relaciona con la secuencia de carga. Pero no tengo idea de resolver. Por favor insinúenme.

Respuesta

8

que resolvieron este llamando al alcance de self.included (clase):

module Timestamps 
    def self.included(k) 
     k.scope :created_yesterday, k.where("created_at" => Date.yesterday.beginning_of_day..Date.yesterday.end_of_day) 
     k.scope :updated_yesterday, k.where("created_at" => Date.today.beginning_of_day..Date.today.end_of_day) 
     k.scope :created_today, k.where("created_at" => Date.today.beginning_of_day..Date.today.end_of_day) 
     k.scope :updated_today, k.where("created_at" => Date.today.beginning_of_day..Date.today.end_of_day) 
    end 
end 
6

En Rails 3 que no hay diferencia entre un alcance declarado y un método de clase que devuelve un ActiveRecord::Relation, por lo que puede ser más elegante para usar un módulo mixin:

class MyClass < ActiveRecord::Base 
    extend ScopeExtension::Timestamps 
end 

module ScopeExtension 
    module Timestamps 
    def recent 
     order('created_at DESC') 
    end 

    def before_at(at) 
     where('created_at < ?' , at) 
    end 

    def after_at(at) 
     where('created_at > ?' , at) 
    end 
    end 
end 

MyClass.after_at(2.days.ago).before_at(1.hour.ago).recent 
Cuestiones relacionadas