Как исправить object.extend для разработки и производства - PullRequest
0 голосов
/ 31 октября 2019

Когда я создаю экземпляр объекта в режиме разработки, список включенных моделей объекта корректен.

Однако в производственном режиме список включенных модулей включает в себя дополнительный модуль, который совершенно неверен и приводит к ошибочным результатам. ,

Я запустил один и тот же код как в режиме разработки, так и в режиме производства.

      require 'blog_import_as'

      options = cmd_hdr BLOG_IMPORT

      raise "file #{options.file_name} doesn't exist".light_red unless File.exists?(options.file_name)

      Blog.transaction do
        bia = BlogImportAs.new
        ap "#{Rails.env} mode "
        ap "before extend"
        ap bia.singleton_class.included_modules
        if File.basename(options.file_name) =~ /^parked-blogs-.*\.csv/
          bia.extend(Buildable)
          ap "after Buildable extend"
          ap bia.singleton_class.included_modules
        end
        if File.basename(options.file_name) =~ /^built-blogs-.*\.csv/
          bia.extend(Deployable)
          ap "after Deployable extend"
          ap bia.singleton_class.included_modules
        end
        ...

Объект определен как:

class BlogImportAs # application server version

  extend ActiveModel::Naming
  include ActiveModel::Conversion
  include ActiveModel::Validations

  FILE_TYPES = %w{ .csv }

  attr_accessor :file, :role

  default_define_debug # makes a dummy method debug!

  validates :file, presence: true
  validates :role, presence: true

  def initialize(attributes = {})
    attributes.each { |name, value| send("#{name}=", value) }
  end
  ...

Ожидаемый результат (в разработкеmode is)

"development mode "
"before extend"
[
    [0] ActiveModel::Validations::HelperMethods,
    [1] ActiveSupport::Callbacks,
    [2] ActiveModel::Validations,
    [3] ActiveModel::Conversion,
    [4] GCLI,
    [5] GrumplesUtility,
    [6] ActiveSupport::Dependencies::Loadable,
    [7] JSON::Ext::Generator::GeneratorMethods::Object,
    [8] PP::ObjectMixin,
    [9] Kernel
]
"after Buildable extend"
[
    [ 0] Buildable,
    [ 1] ActiveModel::Validations::HelperMethods,
    [ 2] ActiveSupport::Callbacks,
    [ 3] ActiveModel::Validations,
    [ 4] ActiveModel::Conversion,
    [ 5] GCLI,
    [ 6] GrumplesUtility,
    [ 7] ActiveSupport::Dependencies::Loadable,
    [ 8] JSON::Ext::Generator::GeneratorMethods::Object,
    [ 9] PP::ObjectMixin,
    [10] Kernel
]

Затем, когда точно такой же код выполняется в рабочем режиме:

"production mode "
"before extend"
[
    [ 0] ActiveModel::Validations::HelperMethods,
    [ 1] ActiveSupport::Callbacks,
    [ 2] ActiveModel::Validations,
    [ 3] ActiveModel::Conversion,
    [ 4] GCLI,
    [ 5] Deployable,
    [ 6] GrumplesUtility,
    [ 7] ActiveSupport::Dependencies::Loadable,
    [ 8] JSON::Ext::Generator::GeneratorMethods::Object,
    [ 9] PP::ObjectMixin,
    [10] Kernel
]
"after Buildable extend"
[
    [ 0] Buildable,
    [ 1] ActiveModel::Validations::HelperMethods,
    [ 2] ActiveSupport::Callbacks,
    [ 3] ActiveModel::Validations,
    [ 4] ActiveModel::Conversion,
    [ 5] GCLI,
    [ 6] Deployable,
    [ 7] GrumplesUtility,
    [ 8] ActiveSupport::Dependencies::Loadable,
    [ 9] JSON::Ext::Generator::GeneratorMethods::Object,
    [10] PP::ObjectMixin,
    [11] Kernel
]

Я обнаружил, что модуль Deployable уже был вставлен в список singleton_class. Помимо того, что его там не должно быть, он реализует тот же интерфейс, что и Buildable, который затем превосходит Buildable и вместо этого запускает версию Deployable, которая неверна.

Я не могу найти, как и когда вставляется модуль Deployableв рабочем режиме, но не в режиме разработки.

Буду признателен за помощь в выяснении, почему он работает в режиме разработки, а не в рабочем режиме.

...