Я пытаюсь добавить некоторые специальные методы в ActiveRecord. Я хочу добавить *_after
и *_before
областей для каждого date
поля модели, так что я могу сделать что-то вроде этого:Расширение ActiveRecord :: Base
User.created_at_after(DateTime.now - 3.days).created_at_before(DateTime.now)
Я следовал решение объясняется здесь Rails extending ActiveRecord::Base, но когда я исполню консоль рельсы и попытаться вызовите методы, я получаю ошибку 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 Консоль рельсов работает нормально. Я получаю 'неопределенные ошибку method', когда я пытаюсь вызвать, например,' User.created_at_before (DateTime.now) ' NoMethodError: неопределенный метод 'created_at_before' для # <Класс: 0x007fb500970b00> .... Здесь это вывод для 'instance_methods' и' методов'. Но учтите, что я пытаюсь определить методы класса. 'ActiveRecordDateExtension.instance_methods => []' 'ActiveRecordDateExtension.methods (false) => []' –