为什么在 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)
=> 应用程序目录前面的斜线而不是点
我正在尝试使用单个 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)
=> 应用程序目录前面的斜线而不是点