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]
-~----------~----~----~----~------~----~------~--~---

Répondre à