如何从另一个Rails引擎扩展Rails引擎中的模型?

我认为最简单的解释方法是用一个人为的例子。 我使用Rails 2.3.8与Ruby 1.8.7和ActiveRecord到MySQL db。

我在一个引擎中有以下(人为)模型(安装在主应用程序的vendor / plugins目录中):

# contrived_app/vendor/plugins/concerts_engine/app/models/ class Concert < ActiveRecord::Base has_many :artists belongs_to :venue end 

以及另一个引擎中的以下(人为)模型:

 # contrived_app/vendor/plugins/tickets_engine/app/models/ class Ticket < ActiveRecord::Base belongs_to :concert end 

我该如何包含/扩展

  has_many :tickets 

在音乐会模型?

此外,加载顺序是否重要,如果是,如果尚未定义/加载Concert模型会发生什么?

是否有可能只包括

  belongs_to :concert 

如果音乐会被定义?

结果我可以在tickets_engine中执行以下操作:

 # contrived_app/vendor/plugins/tickets_engine/config/initializers/concert_extensions.rb # or # contrived_app/config/initializers/concert_extensions.rb Rails.logger.info "\n~~~ Loading extensions to the Concert model from #{__FILE__}\n" Concert.class_eval do has_many :tickets end 

就个人而言,我首选的方法是从tickets_engine扩展Concert模型,但加载顺序和依赖关系很重要。 例如,tickets_engine需要在它的gemspec中添加对concerts_engine的依赖,并且需要在tickets_engine之前加载concert_engine。

我猜您可能需要在演唱会模型中要求Ticket。 或者将整个引擎包装在一个模块中并包含它。