Rails: ссылка на модель ActiveRecord через модуль с тем же именем - PullRequest
0 голосов
/ 15 сентября 2018

У меня определены следующие стандартные Rails ActiveRecord Foo:

# app/models/foo.rb
class Foo < ApplicationRecord
end

И я пытаюсь вызвать Foo.find(..) из иерархии, содержащей модуль, также называемый Foo ..

# lib/commands/bar.rb
module Commands
  module Bar
    module Create
      class Command
        def initialize(params)
          ...
          Foo.find(params[:foo_id]
          ...
        end
      end
    end
  end
end

# lib/commands/foo.rb
module Commands
  module Foo
    module Create
      class Command
        ...
      end
    end
  end
end

Ruby / Rails находит Commands::Foo вместо моей Foo модели и выдает undefined method 'find' for Commands::Foo:Module .. как я могу указать на правильную реализацию ActiveModel?

Очевидный ответ - переименовать Commands::Foo.. в Commands::Foos.., но мне любопытно узнать, есть ли другой способ: o)

1 Ответ

0 голосов
/ 15 сентября 2018

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

Лучшее решение, которое я найду в вашем коде, - убедиться, что вы вызываете соответствующий модуль и метод по его полному пути:

2.3.3 :007 > ::Commands::Foo::Create::Command.new
"Commands::Foo::Command reached"
 => #<Commands::Foo::Create::Command:0x007ffa1b05e2f0>
2.3.3 :008 > ::Commands::Bar::Create::Command.new
"Commands::Bar::Command reached"
 => #<Commands::Bar::Create::Command:0x007ffa1b04f110>

Вы не должны пытаться переопределять или изменять внутренние вызовы Rails, потому что тогда вы изменили структуру, чтобы она соответствовала коду, что приводит к непредсказуемым побочным эффектам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...