Rails trucs rapides #3

Au menu aujourd’hui, le “eager loading” via ActiveRecords.

Je vous avais promis de vous parler prochainement du paramètre :include, voici donc ce à quoi il sert!

Imaginez-vous un blogue contenant plusieurs Posts ayant plusieurs commentaires associé à plusieurs auteurs (exemple classique retaçable sur le web).

À prime abord, on pense immédiatement à faire cela :

@post = Post.find(id)

Par la suite on veut tous les commentaires associés à ce post alors on écrit:

@comments = Comment.all(:select => ‘comment.id, comment.author_id , comment.body’, :conditions => ['comments.post_id = ?', post_id ]

Ensuite pour afficher chaque nom d’auteur sur chaque commentaire on peut faire une opération de ce type

@comments.each do | comment |
puts comment.author.name
end

Pour chaque commentaire une requête sera généré pur aller chercher le nom de l’auteur… Si aucune :limit n’est imposé et qu’il y a plusieurs centaines de commentaires, tout cela peut devenir rapidement malsain et lent.

Il y a plusieurs façon d’approcher le problème bien que je ne prenne pas position ici sur la meilleur façon de procéder. À chaque projet son contexte.

Le “eager loading” nous permet de faire une seule requête pour les charger, le post, les commentaires et l’auteur avec l’utilisation de :include

Nous aurions donc une requête comme celle-ci:

@post = Post.find(:conditions => ['posts.id = ?', post_id ], :include => [:comments, :author] )

Cette requête me retourne tous les commentaires et auteurs associés à ce post d’un seul coup au lieu de faire plusieurs dizaine de requête.

Cette manière de faire peut s’avérer coûteuse au niveau de la base de donnée. J’aurais tendance à essayer de faire des benchmarks ou de regarder le output que Rails donne dans la console afin de voir qu’elles sont les points faibles de l’application afin de l’améliorer. De plus, nous sommes depuis quelques temps abonnés au service de monitoring New Relic. Ce service nous permet d’observer visuellement les endroits ou les performances de nos applications laissent à désirer.

En gardant cela en tête, il sera plus simple d’optimiser le projet lors des dernières phases.

Référence => Eager loading of associations

Bookmark and Share

About djee

Web Developper, Ruby On Rails Apple geek!
This entry was posted in Dev, Web and tagged , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>