为什么在 Rails 单 Table 继承中不初始化子类?

Why are subclasses not initialized in Rails Single Table Inheritance?

我正在尝试使用单个 table 继承 (class Bookstore < Company) 在 Rails(书籍、作者、书店等)上制作一个简单的“图书签名”应用程序。

我在 config/application.rb 中有以下内容:

config.autoload_paths += %W(#{config.root}.app/models/company)

company.rb 和 bookstore.rb 都在 app/models/company 目录中。

Bookstore.create(name: "Barnes and Noble") 在 seeds.rb

当我 运行 rails db:seed 我得到一个错误 uninitialized constant Bookstore

此外,如果我在 rails 控制台中执行 Bookstore.new(...),我会得到同样的错误,但如果我执行 Company.new(...),我会得到 undefined method 'new' for Company:Module很惊讶,因为我认为 Company 是 class:

company.rb 有 class Company < ApplicationRecord

如何设置单个 table 继承以便我可以在子目录中存储 classes?

我正在使用 rails 5.2

谢谢!

如果您想将模型嵌套在命名空间中,您可以这样做:

class Company
end

# app/modules/companies/bookstore.rb
module Companies
  class Bookstore < ::Company
  end
end

# app/modules/companies/cafe.rb
module Companies
  class Cafe < ::Company
  end
end

您希望为命名空间使用单独的常量而不重新打开常量 Company 的原因是 numerous bugs and issues 与 Rails 5.2 和模块中使用的经典自动加载器嵌套在 类.

虽然您可以将路径附加到自动加载器,但放弃模块嵌套为您提供的额外代码组织似乎很愚蠢。它不像污染全局命名空间是一件好事。

原来是打错了:

config.autoload_paths += %W(#{config.root}.app/models/company)

应该是

config.autoload_paths += %W(#{config.root}/app/models/company)

=> 应用程序目录前面的斜线而不是点