2011-08-28 9 views
7

rails3では、私はモデルで同じスコープを作っています。例えばRailsで共通のActiveRecordスコープ(スコープ)をモジュールで使用できますか?

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 

私は共通スコープをlibのモジュールに分割したいと思っています。だから私はこのようにしてみる。

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 

は、と私はこの1つ

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

書くしかし、Railsは、このエラーが表示されます。

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

(私はオートローディングライブラリを忘れていなかった)

どのように私は簡単にアクティブなレコードに共通スコープ機能を再利用することができますか?

この問題は、ロードシーケンスに関係すると思います。しかし、私は解決する考えはありません。 お願いします。

答えて

8

Iはself.included(クラス)にスコープを呼び出し、これを解決:レール3に

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

が宣言範囲とActiveRecord::Relationを返すクラスメソッドとの間に差はないですので、それがよりエレガントであることができます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 
関連する問題