1

我正在将 Rails 应用程序的一部分提取到引擎中。引擎包含与安装引擎的应用程序中的模型类有关系的模型类。在某些情况下,这些关系是必需的。

module Carrier
  class Profile < ActiveRecord::Base
    attr_accessible :company_id
    belongs_to :company, class_name: Carrier.company_class_name
    validates :company, presence: true
  end
end

既然引擎没有Company类,那么在开发过程中应该如何处理这种关系呢?其他人如何“存根”外部类?

4

2 回答 2

2

在引擎中为所需的类创建一个模型(Company在示例中)。

module Carrier
  class Company < ActiveRecord::Base
  end
end

添加一个仅在引擎中的 Dummy 应用程序中运行的迁移。

class CreateCarrierCompanies < ActiveRecord::Migration
  def change
    if Rails.application.class.parent_name == "Dummy"
      create_table :carrier_companies do |t|
        t.timestamps
      end
    end
  end
end

在引擎模块中创建mattr_accessor和其他方法,以便它在开发中使用存根类,但在其他情况下使用定义的类。

module Carrier
  mattr_accessor :company_class_name
  def self.company_class_name
    @@company_class_name || "Carrier::Company"
  end
  def self.company_class
    company_class_name.constantize
  end  
end

company_class_name如果在安装引擎时未设置,您可能需要引发异常。

于 2012-11-25T14:28:03.517 回答
1

对于主应用程序中的任何迁移和模型,我将迁移复制到虚拟应用程序中,并在虚拟应用程序中定义相同的空模型。

于 2012-11-25T15:50:56.460 回答