我试图通过初始化程序添加这样的范围
class ActiveRecord::Base
scope :this_month, lambda { where(:created_at => Time.now.beginning_of_month..Time.now.end_of_month) }
end
但我收到错误“NoMethodError:未定义的方法‘abstract_class?’ 对象:类”。这样做的正确方法是什么?
我试图通过初始化程序添加这样的范围
class ActiveRecord::Base
scope :this_month, lambda { where(:created_at => Time.now.beginning_of_month..Time.now.end_of_month) }
end
但我收到错误“NoMethodError:未定义的方法‘abstract_class?’ 对象:类”。这样做的正确方法是什么?
这是一个可以包含在初始化程序中的工作版本,例如app/initializer/active_record_scopes_extension.rb
.
只需调用MyModel.created(DateTime.now)
or 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)
您正在覆盖一个类,而您应该通过模块来完成它。我也会对这种方法有点小心,因为您依赖于每个具有 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