繁体   English   中英

在 Rails 引擎中扩展应用程序的模型

[英]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::BarModuleself.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM