2013-02-27 72 views
1

在我的Rails應用程序我有模特這樣軌STI和命名空間重複型號名稱

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 

帳戶和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?

回答

0

我建議不要使用class Account::Bonus < Account而是class Bonus < Account。您基本上重複使用前綴Account::,因爲它已經從DiscountSystem繼承。

然後,您還可以刪除方法調用/has_one中的class_name參數。

這樣做會使你的代碼更易於理解,更符合Rails的精神。

+0

我選擇了這個方案,因爲該帳戶已經相當多 - 迄今爲止超過10,因爲每種類型的賬戶我要重載方法和變量。 我認爲語義上正確選擇不在%AccountName%,而不是在帳戶%AccountName%和naymspace帳戶::%帳戶名% 實際上,在示例Account :: Bonus-這是發明的「替代品」到系統的其他實體,他們有一個賬戶。 我很喜歡簡單的代碼添加到實體的帳戶名稱,它是,但在「重複」的變量出來這個錯誤。 – BigForceGun 2013-02-27 16:04:15

相關問題