所以我有一个包含一些activerecord模型的gem,它们被我们平台上的多个应用程序使用。我们有一个常量定义了一个“类型”列表,这些列表在几个不同的应用程序上有所不同。
# in the gem
class MyModel < ActiveRecord::Base
TYPES = ["A Type", "Another Type"]
end
在应用程序代码中重新定义此常量将为已经初始化的常量生成警告。因为它并不是真的不变,所以我决定将它重构为类方法。
# gem
class MyModel < ActiveRecord::Base
def self.types
[]
end
end
# application a
class MyModel < ActiveRecord::Base
def self.types
["A Type", "D Type"]
end
end
# application b
class MyModel < ActiveRecord::Base
def self.types
["B Type", "C Type"]
end
end
但是,在App A或B中访问MyModel.types时,类型为[]
。这个以及其他一些问题让我得出结论,在加载rails应用程序之后加载了gem,而我的假设恰恰相反。
处理这种不同情况的最佳方法是什么?
答案 0 :(得分:3)
在您的应用程序中执行此操作
在config/initializers/
中创建一个文件,并在您的两个应用中添加此代码
MyModel.instance_eval do
def types
["A Type", "D Type"]
end
end
或
MyModel.class_eval do
def self.types
["A Type", "D Type"]
end
end
答案 1 :(得分:0)
您必须从引擎中明确要求初始类,这将确保它已加载。
在开发中有时不是这种情况(例如autoload
)
require YourEngine::Engine.root.join('app/models/your_namespace/my_model')
class MyModel #no inheritance here, we just reopen an existing class, right?
def self.types
[] #override it as you like
end
end