名称空间在 Ruby 中如何工作?

How namespaces work in Ruby?

我正在使用命名空间来组织我的代码,但现在我有点怀疑。我有以下代码:

module ShopApplication
  module Models
    class Product < ::Sequel::Model
      # Model code
    end
  end
end

我所有的模型都包含在这个名为 Models 的模块中。在我的应用程序的另一部分,我有以下内容:

module ShopApplication
  module WebInterface
    class App < ::Sinatra::Base
      get '/' do 
        @products = ShopApplication::Models::Product.all
      end
    end
  end
end

我想在不指定完整路径的情况下使用我的模型。我可以将 @products = ShopApplication::Models::Product.all 转换为 @products = Product.all 吗?如果是,如何?我试过 include ::ShopApplication::ModelsApp class,但是没有用。

Module#include就是你要在这里使用的:

module ShopApplication
  module Models
    class Product < ::Sequel::Model
      # Model code
    end
  end
end

module ShopApplication
  module WebInterface
    class App < ::Sinatra::Base
      include ShopApplication::Models
      get '/' do
        @products = Product.all
      end
    end
  end
end

这是一个人为设计的示例,其中没有您的依赖项,但显示了 class 方法和实例方法:

module ShopApplication
  module Models
    class Product
      def name
        "Product-name"
      end
      def self.all
        ["array", "of", "products"]
      end
    end
  end
end

module ShopApplication
  module WebInterface
    class App
      include ShopApplication::Models
      def instance_meth
        p Product.new.name
      end
      def self.class_meth
        p Product.all
      end
    end
  end
end

ShopApplication::WebInterface::App.new.instance_meth
ShopApplication::WebInterface::App.class_meth