如何从另一个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。 或者将整个引擎包装在一个模块中并包含它。