在我的 Rails 应用程序中,我有这样的模型
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
如果我理解正确,“帐户”的“折扣系统”在命名空间“帐户”中。
他们:
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?
最佳答案
我建议不要使用 class Account::Bonus < Account
但是 class Bonus < Account
反而。您基本上是在重复 Account::
前缀,因为它已经从 DiscountSystem 继承。
那么你也可以放下class_name
belongs_to
中的参数/has_one
方法调用。
这样做将使您的代码更容易理解,并且更符合 Rails 的精神。
关于ruby - rails sti 和命名空间重复模型名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15105860/