ouaip je me doutais bien que c'était le fruit de mon imagination.
Du coup j'utilise une version encore moins élégante :
p.comments.to_ary.find{|comment| comment.mon_champ == ma_valeur}
Merci pour tes explications.
2008/9/24 Renaud (Nel) Morvan <[EMAIL PROTECTED]>
>
>
>
> On 24 sep, 11:28, "guillaume belleguic"
> <[EMAIL PROTECTED]> wrote:
> > Bonjour,
> > J'ai un énorme doute.
> >
> > voici mon exemple :
> > Post : (:title => string, :body => text) , has_many :comments
> > Comment : title => string, :body => text, post_id: integer, belongs_to
> :post
> >
> > je fait :
> > 1 - p = Post.find(:first) # => mon poste
> > 2 - p.comments # => retourne la liste des comments
> > 3 - p.comments.find(1) # => retourne bien le comment avec id ==1
> >
> > Je pensais (je ne sais pas pourquoi) que si les comments était déjà
> chargé
> > un mémoire (ligne 2), lors de la seconde recherche (ligne 3) il cherchait
> > dans le tableau en mémoire mais ne lançait pas une nouvelle requête SQL.
> > Le problème lance une nouvelle requête à chaque fois.
>
> Ca n'a jamais été le cas et ca ne le sera sans doute jamais.
>
> L'association proxy pour les fonctions statiques de la classe
> associées se content d'executer la fonction statique avec pour scope
> l'instance du "owner" (en l'occurrence le post)
>
> p.comments.find(1) est l'équivalent strict de
>
> Comment.with_scope (:post_id => p.id) do
> Comment.find(1)
> end
>
> Pour faire ce que tu veux faire, il va te falloir utiliser detect (qui
> n'est pas une method static de AR)
>
> p.comments.detect({|c| c.id = 1})
> ce qui n'est pas très élégant.
>
> Tu peux faire un truc du genre
>
> class Post << AR::Base
> has_many :comments do
> def get(id)
> load_target.detect {|c| c.id = id}
> end
> end
> end
>
> p.comments.get(1)
>
> Tu pourrais utiliser :[] à la place de :get mais ca ne marchera plus
> dès que tu auras fait un premier f.comments car :[] est une fonction
> de array et donc la méthode ne sera plus déléguée à l'association
> proxy
>
> Renaud
> >
>
--~--~---------~--~----~------------~-------~--~----~
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]
-~----------~----~----~----~------~----~------~--~---