2009-12-09 4 views
1

J'ai deux modèles: CreditCard et BlacklistItem :: CreditCard. Si je recherche un BlacklistItem :: CreditCard Tout d'abord, je reçois le comportement attendu:ActiveRecord #find obtenir la mauvaise classe d'objet

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

Si je recherche un CreditCard d'abord, quand je vais chercher BlacklistItem :: articles CreditCard plus tard je reçois un comportement inattendu:

>> 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* > 
>> 

Qu'est-ce que je fais mal? Est-il simplement impossible d'avoir des noms avec ce genre de relation entre eux? Je vais renommer BlacklistItem :: CreditCard pour contourner le problème, mais ce serait vraiment le meilleur nom pour cet objet particulier.

+0

Pouvez-vous nous montrer les 2 classes de modèles? Cela pourrait aider à comprendre ce qui se passe ici. –

+0

J'ai bien peur de ne pas divulguer comment nous conservons les cartes de crédit. Il suffit de dire que nous n'avons pas outrepassé #find en aucune façon. – edebill

+0

En aparté, vous pouvez appeler 'first' directement, par exemple:' CreditCard.first'. –

Répondre

7

Les modèles nommés dans Rails ont été bogués pendant un certain temps. Il y a un bon article sur le sujet here. Vous pouvez essayer de spécifier explicitement le nom de la table à utiliser pour les cartes de crédit inscrites sur liste noire dans le modèle via:

class BlacklistItem::CreditCard 
    set_table_name :blacklist_item_credit_card 

    ... 

end 

Cependant, même avec cela, ayant un modèle CreditCard de haut niveau et des espaces de noms un, BlacklistItem :: CreditCard, vous pouvez encore rencontrer des problèmes dus au comportement automagique de Rails.

Questions connexes