J'ai trois objets qui sont tous identiques. On a été créé via Eh bien, cette augmentation est heurtée. Je vérifie donc la classe, is_a et instance_of in rails console. Je reçois des résultats contradictoires. Pourquoi auraient-ils la même classe code> code> mais un seul d'entre eux est un item.New code> et les deux autres ont été tirés de la base de données (mongoïde). Je passe un / l'un de ces objets à une autre méthode et la vérification du type dans cette méthode via is_a? Code>: instance_of code> que classe code>? P> >> i0.is_a? Item
=> false
>> i1.is_a? Item
=> false
>> i2.is_a? Item
=> true
>> i0.class
=> Item
>> i1.class
=> Item
>> i2.class
=> Item
>> i0.instance_of?(Item)
=> false
>> i1.instance_of?(Item)
=> false
>> i2.instance_of?(Item)
=> true
3 Réponses :
Je ne connais pas mongoïde, mais généralement, dans une bibliothèque d'accès à la base de données, vous n'obtenez pas l'objet réel de la base de données, mais plutôt un objet proxy qui sert de stand-in pour l'objet stocké dans la DB. . Puisque Ruby manque de fonctionnalités pour mettre en œuvre un proxy transparent parfait, vous verrez parfois des résultats étranges, en particulier lors de l'utilisation d'une identité de réflexion ou d'objet. P>
inspiré du commentaire @ KL-7, il doit se produire en quelque sorte que:
class Item; end
class PseudoItem; end
# PseudodItem think it's an Item:
class << PseudoItem
def inspect
'Item'
end
end
i0 = Item.new
i1 = PseudoItem.new
i0.class #=> Item (correct!)
i1.class #=> Item (wrong, due to redefinition of inspect!)
i0.is_a? Item #=> true
i1.is_a? Item #=> false, as it is a PseudoItem
YA, même problème ici ...
Problème résolu (contourné) avec AM UMLY: P>
i0.class.to_s==Item.to_s
sont i> ils la même classe? Par exemple, les associations AR prétendent être une matrimonie, mais elles ne sont pas.
Pouvez-vous ajouter une sortie de
i0.class.object_id code> et idem pour d'autres objets? Peut-être que cela a quelque chose à voir avec les classes rechargement et vous avez deux instances différentes de la même classe.@Davenewton OK, est-il un meilleur moyen d'enquêter sur une classe et is_a type de choses?
@ KL-7 Bonne suggestion, je ne veux pas ajouter la sortie parce que j'ai renommé les objets quand je les ai postés ici, donc je ne suis pas sûr, ce qui est lequel. Mais ils me sont rendus différents objet_id. Donc, on dirait que je devrais comparer l'objet_id au lieu de .class.
Je pense que
is_a? Code> est le moyen le plus normal de vérifier la classe d'objets. Je crois qu'il y a quelque chose qui ne va pas avec des classes de modèle en cours de chargement en mongoïde. J'ai eu le même problème dans mes spécifications: après le chargement de dbobjet_id code> d'une classe était différent de celui qui a été chargé actuellement. Malheureusement, je n'ai trouvé aucune solution à l'époque et je viens de changer mes spécifications en quelque sorte.