Próbuję dodać niestandardowe metody do ActiveRecord. Chcę dodać *_after
i *_before
zakresów dla każdej date
dziedzinie modelu, więc mogę zrobić coś takiego:Rozszerzenie ActiveRecord :: Base
User.created_at_after(DateTime.now - 3.days).created_at_before(DateTime.now)
Mam następuje rozwiązanie wyjaśnione tutaj Rails extending ActiveRecord::Base ale kiedy uruchomić konsolę szyn i spróbować zadzwoń do metod otrzymuję błąd undefined method
.
Oto mój kod:
# 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
Co robię źle?
Czy pamiętasz opublikowanie śladu stosu? Jak również wynik "ActiveRecordDateExtension.instance_methods"? –
@JeremyRodi Konsola szyn działa normalnie. Pojawia się niezdefiniowany błąd method' 'gdy próbuję się połączyć, na przykład' User.created_at_before (DateTime.now) ' NoMethodError: Metoda niezdefiniowana 'created_at_before' dla # .... Tutaj jest wynikiem dla 'instancji_methods' i' metod'. Ale weź pod uwagę, że próbuję zdefiniować metody klasy. 'ActiveRecordDateExtension.instance_methods => []' 'ActiveRecordDateExtension.methods (false) => []' –