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 à