[英]Extending application's model in rails engine
我有一个定义一些模型的应用程序。 我想将某些模型的功能(例如添加方法、添加关联)从应用程序扩展到我的引擎。 我尝试在引擎中添加一个与我的应用程序模型同名的模型,Rails 会自动合并它们,但是它不起作用。
例如:(应用程序的模型)
class Article < ActiveRecord:Base
def from_application
puts "application"
end
end
(Inside my Engine)
module MyEngine
class Article < ::Article
has_many :metrics, :class_name => 'Metric'
end
end
当我尝试访问@articles.metrics 时,has_many 关联并未应用于我的文章模型。 有任何想法吗 ?
你有正确的想法,而且很接近。 但是你的实现有点偏离。
通常,您的引擎应该不知道您的主机应用程序。 这样,您的引擎和主机应用程序保持松散耦合。 所以,在你的引擎类不应该从班在你的主机应用程序继承。 (顺便说一句,你的方法行不通,我相信,因为 ruby 进行不断查找的方式,但这是一个不同的讨论。)
相反,使用包含的 hook 。 在主机应用程序中,您可以执行以下操作:
class Article < ActiveRecord:Base
include FooEngine::BarModule
def from_application
puts "application"
end
end
在发动机内部:
module FooEngine
module BarModule
def self.included(base)
base.class_eval do
has_many :metrics, :class_name => 'Metric'
end
end
end
end
当 ruby 解释器在Article
包含FooEngine::BarModule
时,它将查找并运行(如果找到) FooEngine::BarModule
的self.included
方法,将Article
类作为base
传入。
然后,您在base
( Article
) 上调用class_eval
,这将重新打开Article
类,以便您可以添加方法或您要做的任何事情(原位定义新方法,包括或扩展其他模块等)。
在您的示例中,您调用has_many
方法,该方法将创建has_many
提供的各种关联方法。
如果 (a) 您将通过引擎添加许多与指标相关的功能,(b) 您希望有很多类使用与指标相关的功能,以及 (c) 您想要一些功能要因类而异(如果包括在内),您可以考虑创建一个acts_as_having_metrics
(或类似的)。 一旦你沿着这条路走下去,就会进入一个奇妙的元编程的全新世界。
祝你好运。
您的指标模型是否与 Articles 关联?
您可能希望为关联的另一端 Metrics 提供一个所属的文章,以使其正常工作。 此外,请确保迁移以在指标表上保存文章 ID。 一切都应该正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.