【发布时间】:2018-12-25 10:57:44
【问题描述】:
我正在尝试编写一个 lib 插件/扩展来执行我需要知道哪些模型已被标记为与此插件一起使用的操作。
目前,我以acts_as_something 方法的方式标记模型,该方法添加到每个打算与插件一起使用的模型中。
插件的主文件是这样的
# lib/foo.rb
module Foo
class << self
attr_accessor :models
end
self.models = []
module Model
def acts_as_foo
Foo.models << self
end
end
ActiveSupport.on_load(:active_record) do
extend Foo::Model
end
预期用途是然后调用控制器Foo.perform,它需要知道标记的模型才能执行预期的操作,其想法是从Foo.models 获取模型列表。
如果在 development.rb 中将 config.eager_load 设置为 true 时,它会按预期工作,否则模型的文件尚未使用/加载,因此 Foo.models 是一个空数组。
我的目标是能够向 Foo 添加更多模型,而无需像这样更改 Foo 的代码。
#app/models/bar.rb
class Bar < ApplicationRecord
acts_as_foo
end
关于实现这一点的最佳方法的任何想法?
【问题讨论】:
标签: ruby-on-rails ruby metaprogramming ruby-on-rails-plugins