2009-12-09 96 views
1

我有兩種模式:CreditCard和BlacklistItem :: CreditCard。如果我搜索了BlacklistItem ::信用卡式第一,我得到預期的行爲:ActiveRecord#找到錯誤的對象類別

>> BlacklistItem::CreditCard.find(:all).first 
=> #<BlacklistItem::CreditCard id: 5, *snip* > 
>> 

如果我搜索了信用卡式第一,當我去尋找BlacklistItem ::信用卡式的項目後,我得到意外的行爲:

>> CreditCard.find(:all).first 
=> #<CreditCard id: 2, key_id: 4, *snip* > 
>> BlacklistItem::CreditCard.find(:all).first 
(irb):2: warning: toplevel constant CreditCard referenced by BlacklistItem::CreditCard 
=> #<CreditCard id: 2, key_id: 4, *snip* > 
>> 

我在做什麼錯?在他們之間有這種關係的名字是不可能的?我將重命名BlacklistItem :: CreditCard作爲解決方案,但它確實是此特定對象的最佳名稱。

+0

你能告訴我們2個模型類嗎?這可能有助於弄清楚這裏發生了什麼。 – 2009-12-09 16:16:58

+0

恐怕我不舒服地泄露我們如何存儲信用卡。只要說我們沒有以任何方式覆蓋#find即可。 – edebill 2009-12-09 16:22:51

+0

另外,您可以直接調用'first',例如:'CreditCard.first'。 – 2009-12-09 16:32:56

回答

7

Rails中的名稱空間模型已經有很長一段時間了。關於這件事here有一個很好的寫法。您可以嘗試顯式指定表名通過在模型中使用列入黑名單的信用卡:

class BlacklistItem::CreditCard 
    set_table_name :blacklist_item_credit_card 

    ... 

end 

然而,即使有這樣的,有一個頂級信用卡式模型和命名空間的一個,BlacklistItem ::信用卡式,你還可以由於Rails的自動化行爲而遇到問題。