Active record: proxy association

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.
Afin d’amélioré la rapidité d’une application j’ai voulu utilisé l’eager
loading puis d’appliquer une recher spécifique, mais au lieu d’avoir une
seul requête je me retrouve avec 2.

C’est normal docteur.

Merci d’avance pour vos conseils.

On 24 sep, 11:28, “guillaume belleguic”
[email protected] wrote:

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

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]