3

イニシャライザを介して、このようなスコープを追加しようとしました

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

しかし、「NoMethodError: undefined method `abstract_class?」というエラーが表示されます。オブジェクト:クラスの場合」。これを行う適切な方法は何ですか?

4

2 に答える 2

0

のようなイニシャライザに含めることができる作業バージョンを次に示します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)
于 2014-04-23T21:32:32.847 に答える
0

モジュールを介して実行する必要があるときに、クラスをオーバーライドしています。また、created_at を持つすべてのモデルに依存しているため、このアプローチには少し注意が必要です。

module ActiveRecord
  class Base
    scope :this_month,  lambda { where(:created_at => Time.now.beginning_of_month..Time.now.end_of_month) }
  end
end
于 2012-05-01T19:07:49.733 に答える