首页 > 解决方案 > 每当我们从控制器运行列表/查找查询时,如何调用 Gem 的自定义函数(通过在模型中添加任何 attr_accessor/Method/Callbacks)?

问题描述

我正在开发我的自定义 gem,它将根据给定的参数提供翻译。我已使用mobility gem https://github.com/shioyama/mobility作为我的自定义 gem 的依赖项。

我在我们的自定义 gem 中准备了一个通用函数,它将根据给定的参数为我们提供所需的结果(我们正在使用移动 gem 来翻译记录)。我正在寻找一种解决方案来调用自定义 gem 通用函数每当从控制器调用任何查找查询或列表查询时。

这意味着如果我Center.all在中心控制器索引方法中调用中心列表查询,它应该在从数据库中获取数据后转到自定义 gem 通用函数。我们的共同功能是根据给定的参数翻译记录并返回翻译结果。find 查询也应该发生同样的情况。知道如何通过在模型中添加任何 attr_accessor/method/callback 函数来实现这些事情吗?根据我们添加的方法/回调函数,它将决定是否应该进入自定义 gem。

任何帮助都感激不尽。

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 常用功能。我们的共同功能是根据给定的参数翻译记录并返回翻译结果。find 查询也应该发生同样的情况。

标签: ruby-on-railsrubyrubygemsmobility

解决方案


您可以简单地覆盖模型类中的所有内容。

例如我有一个标签模型。

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

推荐阅读