Как мне поступить с требуемыми моделями, внешними по отношению к движку Rails, во время разработки?

Я извлекаю части приложения 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, как следует обрабатывать эту связь во время разработки? Что делают другие люди, чтобы «заглушить» внешние классы?


person barelyknown    schedule 25.11.2012    source источник


Ответы (2)


Создайте в движке модель для нужного класса (в примере Company).

module Carrier
  class Company < ActiveRecord::Base
  end
end

Добавьте миграцию, которая будет выполняться только в фиктивном приложении внутри движка.

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 не установлен при монтировании движка.

person barelyknown    schedule 25.11.2012

Для любой миграции и моделей в основном приложении я копирую миграции в фиктивное приложение и определяю для них пустую модель в фиктивном приложении.

person Rahul garg    schedule 25.11.2012