Как вызывать пользовательские функции 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
Другие вопросы по тегам