2012-05-01 11 views
3

私は初期化子イニシャライザ経由でActiveRecord :: Baseにスコープを追加しますか?

class ActiveRecord::Base   
    scope :this_month, lambda { where(:created_at => Time.now.beginning_of_month..Time.now.end_of_month) } 
end 

しかし、イムはエラーを取得「NoMethodErrorを経由して、このような範囲を追加しようとしました:?未定義のメソッド `abstract_class」オブジェクトのためのクラス: "。これを行う適切な方法は何ですか?

答えて

0

モジュールを使用してクラスをオーバーライドする必要があります。 あなたがここ

module ActiveRecord 
    class Base 
    scope :this_month, lambda { where(:created_at => Time.now.beginning_of_month..Time.now.end_of_month) } 
    end 
end 
+2

これで問題は解決しませんでした。同じエラー。 – pixelearth

+0

実際のイニシャライザコードとファイルの場所を投稿した場合は役に立ちます。 –

0

のcreated_at持つすべてのモデルにrelingされているので、私もこのアプローチには少し注意が必要でしょうが、あなたがapp/initializer/active_record_scopes_extension.rbのような初期化子に含むことができ、作業バージョンです。

MyModel.created(DateTime.now)またはMyModel.updated(3.days.ago)としてください。

module Scopes 
    def self.included(base) 
    base.class_eval do 
     def self.created(date_start, date_end = nil) 
      if date_start && date_end 
      scoped(:conditions => ["#{table_name}.created_at >= ? AND #{table_name}.created_at <= ?", date_start, date_end]) 
      elsif date_start 
      scoped(:conditions => ["#{table_name}.created_at >= ?", date_start]) 
      end 
     end 
     def self.updated(date_start, date_end = nil) 
      if date_start && date_end 
      scoped(:conditions => ["#{table_name}.updated_at >= ? AND #{table_name}.updated_at <= ?", date_start, date_end]) 
      elsif date_start 
      scoped(:conditions => ["#{table_name}.updated_at >= ?", date_start]) 
      end 
     end 
    end 
    end 
end 

ActiveRecord::Base.send(:include, Scopes) 
関連する問題