2012-05-01 4 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 

Но Im получаю ошибку «NoMethodError: неопределенный метод` abstract_class» для объекта: класс ". Каков правильный способ сделать это?

ответ

0

Вы переопределяете класс, пока вы должны делать это через модуль. Я хотел бы также быть осторожным с этим подходом, поскольку вы reling на каждой модели, имеющей 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 
+2

это не исправило проблему. такая же ошибка. – pixelearth

+0

Было бы полезно, если бы вы разместили фактический код инициализатора, а также местоположение файла. –

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) 
Смежные вопросы