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

Répondre à