Merci pour ces éclaircissements. J'étais persuadé que le problème venait de la STI mais en fait c'est bel et bien lié aux AssociationProxy. Ce qui n'est pas très clair, je trouve, c'est que lorsque tu fais un peu d'introspection sur cet objet, il n'est mentionné à aucun moment la classe AssociationProxy :
>> pp Man.find(:first).pet.class.ancestors [Dog(id: integer, man_id: integer, type: string, created_at: datetime, updated_at: datetime), Animal(id: integer, man_id: integer, type: string, created_at: datetime, updated_at: datetime), ActiveRecord::Base, ActiveRecord::AttributeMethods, ActiveRecord::Serialization, ActiveRecord::Calculations, ActiveRecord::Reflection, ActiveRecord::Transactions, ActiveRecord::Aggregations, ActiveRecord::Associations, ActiveRecord::Timestamp, ActiveRecord::Observing, ActiveRecord::Callbacks, ActiveRecord::Locking::Pessimistic, ActiveRecord::Locking::Optimistic, ActiveRecord::Validations, Object, PP::ObjectMixin, InstanceExecMethods, Base64::Deprecated, Base64, Kernel] Pour info, je souhaitais à la base définir cette méthode pour tous les AR:Base ainsi que d'autres modèles à moi, et donc, la solution de facilité m'a poussé à définir cette méthode pour tous les Object. Du coup, j'ai décidé d'enlever la méthode foo de la classe Object et de la mettre uniquement là où elle est utile. Encore une fois, merci beaucoup, Salim On 3 sep, 21:18, Lionel Bouton <[EMAIL PROTECTED]> wrote: > Salim a écrit, le 09/03/2008 06:42 PM : > > > > >>> dog.foo > > > => "bar Animal" > > >>> man.pet.foo > > > => "foo Object" > > > Quelqu'un saurait-il expliquer pourquoi à travers l'association, > > l'objet 'Dog' ne parvient pas à hériter de la méthode 'foo' de sa > > classe parente ??? > > Parce que man.pet n'est pas un objet Dog, mais un AssociationProxy. Ce > dernier implémente des méthodes permettant d'éviter de créer l'objet Dog > en mémoire dans certaines situations, elles sont codées directement dans > l'AssociationProxy (c'est pourquoi sur un habtm ou has_many l'appel à > count fait un SELECT count(*) en base au lieu de charger tous les objets > de la relation). Si l'objet n'a pas la méthode, method_missing peut > alors (si nécessaire) créer l'objet Dog et lui passer le message. > Comme foo est dans Objet, il est également dans l'AssociationProxy... > > Solution : ne pas polluer la classe Object avec foo, c'est extrèmement > fragile comme pratique. Selon ton besoin on pourra essayer de te > proposer quelque chose de plus élégant et en tout cas de robuste. > > Lionel --~--~---------~--~----~------------~-------~--~----~ Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de Google Groups. Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse [email protected] Pour résilier votre abonnement envoyez un e-mail à l'adresse [EMAIL PROTECTED] -~----------~----~----~----~------~----~------~--~---
