ruby - rails sti 和命名空间重复模型名称

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

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

相关文章:

ruby-on-rails - Rails 3 link_to 路由(编辑)嵌套资源

c# - 使用 C# 反序列化 XML 文件,其中元素具有属性和值

css - 应该在 Firefox 的 userContent.css 中定义什么命名空间?

ruby-on-rails - 弃用 Active Storage 的 ImageProcessing 转换器中的 combine_options

html - 您可以使用 Jekyll 的 _includes 文件夹中的子目录吗?

ruby-on-rails - 在 Rails 2.0/ruby 1.8.6 中,如何在字符串数组中找到非 ascii 字符串?

ruby-on-rails - 翻译 Rails Devise 错误消息

html - ruby rails : Adding a second custom view to a controller (Rails 3)

Python 描述符 - 文档不清楚

ruby-on-rails - rails erb 表单助手 options_for_select :selected