Avant même de faire des named_scope (ce qui est bien) ce serait bien de
comprendre pourquoi ta jointure ne marche pas. Et c'est assez simple, en
fait. En SQL, une jointure "propre" c'est :
SELECT *
FROM users
INNER JOIN logs ON users.id = logs.user_id
WHERE users.name = "truc"
Quelle étrange chose, qu'est-ce donc que cet "INNER JOIN table ON condition"
? He ben c'est une jointure justement, mais écrite proprement, c'est à dire
en exprimant :
- quelle est la table primaire, celle "d'où l'on part" : FROM users
- quelle est la table jointe, celle que l'on recolle : INNER JOIN logs
- quelle est la clause de jointure (la condition qui permet de
restreindre le produit cartésien résultant) : ON users.id = logs.user_id
Note au passage que la convention Rails, c'est de nommer une clef étrangère
{nom_de_la_table_etrangere}_id, sinon tes jointures sont plus compliquées à
faire. Tu n'as pas besoin de mettre un id à la table logs aussi, mais à ta
place je le ferais, ça ne te coûte rien mais ça pourrait servir. Autre
petite notion de SQL, si tu faisais un INNER JOIN, il ne te trouverait que
les users qui ont au minimum un log. Pour trouver les users même s'ils n'ont
pas de log, il faudrait faire LEFT JOIN ... ON à la place de INNER JOIN ...
ON.
Maintenant, des notions de Rails :
class User
has_many :logs
end
En supposant que tu as nommé la clef étrangère de la table log user_id, ça
te donne plein de méthodes magiques, comme User.find(1).logs par exemple,
qui va chercher les logs de cet user. Mieux encore, ça permet de faire de
l'eager-loading :
Users.find(1, ;include => ;logs)
Et il va faire tout seul comme un grand la jointure, et te retourner le
résultat avec une seule requête d'effectué. Note au passage qu'il n'est même
pas la peine d'exprimer la condition de la jointure, Rails va directement
comprendre que la condition de jointure est users.id = logs.user_id parce
que tu auras cette fois respecté les conventions. Respecter les conventions
de Rails n'est pas strictement obligatoire, mais les ignorer tout le temps
c'est comme utiliser un marteau pour visser des vis, tu peux y arriver, mais
tu ferais mieux d'utiliser un tourne-vis quand même.
A l'occasion, faire un petit tour dans la documentation d'ActiveRecords ne
te ferais pas de mal, soit dit en passant. Tout ce que je viens de
t'expliquer ici est plutôt trivial...
Michel Belleville
--~--~---------~--~----~------------~-------~--~----~
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]
-~----------~----~----~----~------~----~------~--~---