rails sti和namespace重复模型名称

时间:2013-02-27 06:49:23

标签: ruby ruby-on-rails-3 namespaces sti

在我的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?

2 个答案:

答案 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
...