Utilisation du :include

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?

Dommage car du coup on n’utilise la puissance des relations

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}, …)

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)

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 :wink:

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 [email protected]

Et pour économiser quelques caractères : user.buildings.all(:include =>
:roles)

2009/7/3 Tranquiliste [email protected]

Emilien T. 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.

La solution toute bête est
user.buildings.find(:all, :include => :roles)

J’utilise la relation et le include

le .all, ce n’est pas à partir de la 2.2 ou de la 2.3 (je suis en 2.1)

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.