Как вызывать пользовательские функции Gem (добавляя любые атрибуты attr_accessor / Method / Callbacks в модель) всякий раз, когда мы запускаем запрос листинга / поиска из контроллера? - PullRequest
0 голосов
/ 09 февраля 2019

Я работаю над созданием своего собственного драгоценного камня, который будет предоставлять переводы на основе заданных параметров.Я использовал mobility gem https://github.com/shioyama/mobility в качестве зависимости моего пользовательского гема.

Я подготовил общую функцию в нашем пользовательском геме, которая даст нам желаемый результат на основе заданных параметров (мы используемкамень мобильности для перевода записей).Я нахожу решение для вызова пользовательской общей функции gem Каждый раз, когда любой запрос на поиск или листинг вызывается из контроллера.

Это означает, что если я позвоню в центр запроса списка Center.all в методе индекса центра контроллера, он должен перейти кПользовательская общая функция драгоценного камня после извлечения данных из базы данных.Наша общая функция будет переводить записи на основе заданных параметров и возвращать результат с переводами.То же самое должно произойти и с поисковым запросом.Любая идея, как такие вещи могут быть достигнуты путем добавления каких-либо функций 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 Ответ

0 голосов
/ 09 февраля 2019

Вы можете просто переопределить все в своем классе модели.

Например, у меня есть модель 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, чтобы переопределить все и при этом иметь возможность вызывать оригинал *Метод 1011 *.

Tag.singleton_class.send :prepend, LocalOverrides

В обоих случаях вы получите желаемый результат - возможность «обернуть» метод all своим собственным кодом.

Tag.all 
#=> before
#=> #<Tag::ActiveRecord_Relation ... 
#=> after
...