1

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

Account and DiscountSystem - STI 模型

之后,我希望 DiscountSystem 有 Account,仅用于 DiscountSystem 的帐户,并将新模型命名为 Account::DiscountSystem

如果我理解正确,“Account”的“DiscountSystem”在命名空间“Account”中。

他们:

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?

4

2 回答 2

0

我在这里找到了解决方案。

Mongoid 模型和此处的警告引用的顶级常量

https://github.com/rails/rails/issues/6931

require_dependency 'account/discount_system'

class DiscountSystem  < ActiveRecord::Base
...
于 2013-02-28T11:16:19.420 回答
0

我建议不要使用class Account::Bonus < Account,而是使用class Bonus < Account。您基本上是在使用Account::前缀重复自己,因为它已经从 DiscountSystem 继承。

然后你也可以在/方法调用中删除class_name参数。belongs_tohas_one

这样做将使您的代码更易于理解,并且更符合 Rails 的精神。

于 2013-02-27T10:05:03.733 回答