ruby-on-rails - 每当我们从控制器运行列表/查找查询时,如何调用 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 查询也应该发生同样的情况。
解决方案
您可以简单地覆盖模型类中的所有内容。
例如我有一个标签模型。
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
推荐阅读
- mysql - cakephp3 自己的查询生成器
- c++ - 在 Linux 中使用 C/C++ 强制 tcp/ip 跟踪路由通过某个跃点
- javascript - 组件仅在两次单击后更新 React
- php - 如何获取所有内容
- c# - 如何使用 Sql 查询从数据行中获取完全匹配
- c++ - 将数组的值解包为可变参数函数的参数
- python - 使用 Python/Keras 训练长期短期记忆网络时出现 InvalidArgumentError(音频分类)
- ruby-on-rails - ActiveAdmin - 显示关联模型的属性
- php - 更改租户数据库后,Laravel Auth 外观不起作用
- javascript - Firebase 错误:提供给 sendToDevice() 的注册令牌必须是非空字符串或非空数组