【发布时间】:2015-11-14 12:11:41
【问题描述】:
我正在尝试向 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的结果? -
@JeremyRodi rails 控制台运行正常。当我尝试调用时出现
undefined method错误,例如,User.created_at_before(DateTime.now)NoMethodError: undefined method 'created_at_before' for #<0x007fb500970b00>>>0x007fb500970b00>
标签: ruby-on-rails ruby ruby-on-rails-4 activerecord metaprogramming