Как вызывать пользовательские функции Gem(добавляя любые attr_accessor/Method/Callbacks в модель) всякий раз, когда мы запускаем запрос листинга / поиска из контроллера?
Я работаю над созданием своего собственного драгоценного камня, который будет предоставлять переводы на основе заданных параметров. я использовал mobility gem
https://github.com/shioyama/mobility как зависимость от моего драгоценного камня.
Я подготовил общую функцию в нашем пользовательском геме, которая даст нам желаемый результат на основе заданных параметров (мы используем гем мобильности для перевода записей). Я нахожу решение для вызова пользовательской общей функции gem Каждый раз, когда любой запрос на поиск или листинговый запрос вызывается из контроллера.
Это означает, что если я позвоню в центр списка запросов Center.all
в методе индекса центрального контроллера, он должен перейти к пользовательской общей функции gem после извлечения данных из базы данных. Наша общая функция будет переводить записи на основе заданных параметров и возвращать результат с переводами. То же самое должно произойти и с поисковым запросом. Любая идея, как такие вещи могут быть достигнуты путем добавления каких-либо функций attr_accessor / method / callback в модели? Основываясь на нашей добавленной функции метода / обратного вызова, он решит, должен ли он перейти в пользовательский гем или нет.
Любая помощь будет высоко ценится.
def index
@centers = Center.all
# Here when i call, Center.all, it should go to common function of my custom gem with data and return back.
render json: {status: 'success', data: @centers}, status: :ok
end
если я позвоню запрос листинга Center.all
в методе индекса центрального контроллера, он должен перейти к пользовательской общей функции gem после извлечения данных из базы данных. Наша общая функция будет переводить записи на основе заданных параметров и возвращать результат с переводами. То же самое должно произойти и с поисковым запросом.
1 ответ
Вы можете просто переопределить все в вашем классе модели.
Например, у меня есть модель Tag.
class Tag < ApplicationRecord
belongs_to :run
def self.all
puts "before"
puts super
puts "after"
end
end
Но если вы хотите сделать это для ряда моделей, возможно, будет лучше использовать Module # prepend
Если я создаю модуль с некоторыми локальными переопределениями.
module LocalOverrides
def all
puts "before"
puts super
puts "after"
end
end
Я также могу использовать prepend, чтобы переопределить все и все еще быть в состоянии вызвать оригинал all
метод.
Tag.singleton_class.send :prepend, LocalOverrides
В обоих случаях вы получите желаемый результат - возможность "обернуть" метод all своим собственным кодом.
Tag.all
#=> before
#=> #<Tag::ActiveRecord_Relation ...
#=> after