在我的rails app中我有这样的模型
class Account < ActiveRecord::Base
class Account::Bonus < Account
class Account::Virtual < Account
...more
就像这样
class DiscountSystem < ActiveRecord::Base
class DiscountSystem::MyFirst < DiscountSystem
class DiscountSystem::MySecond < DiscountSystem
帐户和折扣系统 - STI模型
之后,我希望DiscountSystem有Account,仅为DiscountSystem帐户,并命名新模型Account :: DiscountSystem
如果我理解正确,“帐户”的“DiscountSystem”在名称空间“帐户”中。
它们:
class Account::DiscountSystem < Account
belongs_to :discount_system,class_name: '::DiscountSystem',:foreign_key => :owner_id
end
和
class DiscountSystem < ActiveRecord::Base
has_one :account, :class_name => 'Account::DiscountSystem',:foreign_key => :owner_id
end
如果我在控制台中尝试
>> DiscountSystem::MyFirst.all
LoadError: Expected C:/.../app/models/account/discount_system.rb to define DiscountSystem
>> DiscountSystem.all
NoMethodError: undefined method `all' for DiscountSystem:Module
为什么呢? 我可能是一个非常误解的命名空间概念。
当然,如果我将Account :: DiscountSystem重命名为Account :: ForDiscountSystem,一切运作良好。为什么名称空间中的帐户“重写”根名称DiscountSystem?
答案 0 :(得分:0)
我建议不要使用class Account::Bonus < Account
而是使用class Bonus < Account
。您基本上使用Account::
前缀重复自己,因为它已经从DiscountSystem继承。
然后,您还可以在class_name
/ belongs_to
方法调用中删除has_one
参数。
这样做可以让您的代码更容易理解,更符合Rails的精神。
答案 1 :(得分:0)
我在这里找到了解决方案。
Top level constant referenced by warning for Mongoid model 在这里
https://github.com/rails/rails/issues/6931
require_dependency 'account/discount_system'
class DiscountSystem < ActiveRecord::Base
...