我正在开发自己的定制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通用函数。我们的共同功能是根据给定的参数翻译记录,并通过翻译返回结果。查找查询也应该发生同样的情况。
答案 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