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

时间:2019-02-09 08:55:44

标签: ruby-on-rails ruby rubygems mobility

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

我已经在自定义gem中准备了一个通用函数,它将根据给定的参数为我们提供所需的结果(我们正在使用移动性gem来转换记录)。我正在寻找一种调用自定义gem通用功能的解决方案,只要从控制器调用任何查找查询或列表查询即可。

这意味着,如果我以中心控制器索引方法调用中心列表查询Center.all,则从数据库中获取数据后应转到自定义gem通用函数。我们的共同功能是根据给定的参数翻译记录,并通过翻译返回结果。查找查询也应该发生同样的情况。是否知道如何通过在模型中添加任何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通用函数。我们的共同功能是根据给定的参数翻译记录,并通过翻译返回结果。查找查询也应该发生同样的情况。

1 个答案:

答案 0 :(得分:0)

您可以直接覆盖模型类中的所有内容。

例如,我有一个标记模型。

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

在两种情况下,您都将获得所需的结果,即能够用自己的代码“包装”所有方法。

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