Forum: Rails France Utilisation du :include

Posted by Tranquiliste (Guest)
on 2009-07-01 11:34
(Received via mailing list)
Bonjour,

Il y a sans doute quelque chose que je ne comprends pas dans le
fonctionnement du :include.

J'ai 3 modeles
User, Role, Building

Au niveau de user j'ai une relation
has_many buildings, :through => roles

Dans mon conroleur je fais
@buildings = user.buildings(:include => [:roles])

et dans ma vue j'ai une boucle sur @buildings avec l'affichage des
roles

Mais quand je regarde les traces, je vois que j'ai une requete pour
chaque role ce qui me donne l'impression que le :include ne fonctionne
pas.

Votre avis?
Posted by Fernando Perez (fernando)
on 2009-07-01 13:46
> Mais quand je regarde les traces, je vois que j'ai une requete pour
> chaque role ce qui me donne l'impression que le :include ne fonctionne
> pas.
> 
> Votre avis?

Ca ne marche pas comme ça, tu dois dans ce cas écrire ta requête 
complète, donc ça serait un truc du genre (à la pluralization près):

User.find(..., :include => {:role => :buildings}, ...)
Posted by Tranquiliste (Guest)
on 2009-07-01 13:53
(Received via mailing list)
Dommage car du coup on n'utilise la puissance des relations
Posted by Fernando Perez (fernando)
on 2009-07-01 22:39
> Dommage car du coup on n'utilise la puissance des relations
Rails ne fait pas non plus le café Oo ? Quel scandale!!!

Ecris tes named_scope et t'auras un truc similaire à ce que tu veux 
faire:
@buildings = user.include_roles.include_buildings.

Le souci avec Rails c'est qu'on devient très paresseux hein ;-)
Posted by Tranquiliste (Guest)
on 2009-07-01 22:51
(Received via mailing list)
C'est pas tant une question de paresse que de logique. Si je défini
des relations mais que je ne peux pas m'en servir c'est un peu
embêtant car globalement dans un grand nombre de cas, tu vas chercher
les éléments de la relation pour les afficher et dans ce cas ta
relation has_many, ne te sers plus à rien (ou je n'ai pas compris)
Posted by Emilien Taque (Guest)
on 2009-07-01 23:07
(Received via mailing list)
Tu peux également mettre le :include par défaut dans la définition de ta
relation (mais ce n'est peut-être pas ce que tu veux faire).

2009/7/1 Tranquiliste <nicolas.aguttes@googlemail.com>
Posted by Fernando Perez (fernando)
on 2009-07-02 23:02
Emilien Taque wrote:
> Tu peux également mettre le :include par défaut dans la définition de ta
> relation (mais ce n'est peut-être pas ce que tu veux faire).
En pratique je trouve ça pas pratique du tout, à moins qu'on puisse le 
rendre optionnel?

S'il veut juste sa liste de user et qu'il n'a pas besoin du reste, et 
bien Rails va quand même faire les jointures qui peuvent devenir 
coûteuses.
Posted by Tranquiliste (Guest)
on 2009-07-03 20:35
(Received via mailing list)
La solution toute bête est
user.buildings.find(:all, :include => :roles)

J'utilise la relation et le include
Posted by Emilien Taque (Guest)
on 2009-07-03 23:47
(Received via mailing list)
Et pour économiser quelques caractères : user.buildings.all(:include =>
:roles)

2009/7/3 Tranquiliste <nicolas.aguttes@googlemail.com>
Posted by Tranquiliste (Guest)
on 2009-07-04 10:10
(Received via mailing list)
le .all, ce n'est pas à partir de la 2.2 ou de la 2.3 (je suis en 2.1)
Posted by Fernando Perez (fernando)
on 2009-07-04 13:50
Tranquiliste wrote:
> La solution toute b�te est
> user.buildings.find(:all, :include => :roles)
Ouaip en fait c'est possible. Je l'ai découvers tout à l'heure en 
faisant:

user.buildings.find(3)

Sous le capot ça doit être du named_scope.
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.