我正在尝试为ActiveRecord添加一些自定义方法。我想为模型的每个date
字段添加一个*_after
和*_before
范围,以便我可以像这样做:
User.created_at_after(DateTime.now - 3.days).created_at_before(DateTime.now)
我按照这里解释的解决方案Rails extending ActiveRecord::Base进行了操作,但是当我执行rails控制台并尝试调用方法时,出现了undefined method
错误。
以下是我的代码:
# config/initializers/active_record_date_extension.rb
require "active_record_date_extension"
# lib/active_record_date_extension.rb
module ActiveRecordDateExtension
extend ActiveSupport::Concern
included do |base|
base.columns_hash.each do |column_name,column|
if ["datetime","date"].include? column.type
base.define_method("#{column_name}_after") do |date|
where("#{column_name} > ?", date)
end
base.define_method("#{column_name}_before") do |date|
where("#{column_name} < ?", date)
end
end
end
end
end
Rails.application.eager_load!
ActiveRecord::Base.descendants.each do |model|
model.send(:include, ActiveRecordDateExtension)
end
我做错了什么?
ActiveRecordDateExtension.instance_methods
的结果? - Jeremy RodiUser.created_at_before(DateTime.now)
时,会出现“未定义方法”错误。NoMethodError: undefined method 'created_at_before' for #Class:0x007fb500970b00....这是instance_methods
和methods
的输出。但请注意,我正在尝试定义类方法。ActiveRecordDateExtension.instance_methods => []
ActiveRecordDateExtension.methods(false) => []
- Simon Soriano