代码之家  ›  专栏  ›  技术社区  ›  jitbit

Rails:在具有相同名称的模块上引用ActiveRecord模型

  •  0
  • jitbit  · 技术社区  · 6 年前

    我有以下标准记录 Foo

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

    我想打电话给你 Foo.find(..) 在包含模块(也称为

    # 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 而不是我的 模型与投掷 undefined method 'find' for Commands::Foo:Module .. 如何指出正确的ActiveModel实现?

    显而易见的答案是重新命名 Commands::Foo.. Commands::Foos.. 但我很想知道是否还有别的方法:o)

    1 回复  |  直到 6 年前
        1
  •  1
  •   Mark    6 年前

    如果要避免冲突,则应重命名模块。现有的结构是笨拙的,并将提出类似的问题,所有未来的维修人员。

    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调用,因为这样您就修改了框架以适应代码,这会导致不可预知的副作用。