Find(:all) de multiple habtm

Bonjour,

J’ai un model “Video” qui est lié en habtm à trois autres que l’on va
nommer “un”, “deux” et “trois”.
Je voudrais savoir comment le plus simplement possible récupérer les
records de “Video” en fonction d’objets des trois models en HABTM,

qqch comme :
@un = Un.find(:all)
@deux = Un.find(:all)
@trois = Un.find(:all)

Video.find(:all).@un.@deux.@trois

Quand il n’y en a que un en jeux je sais que je peux faire :
@un.videos.find(:all)

Le problème c’est qu’avec plusieurs HABTM comme ci-dessous je sais pas
faire, a part avec plein de lignes de find… le truc horrible :confused:

Merci d’avance.

Je n’ai pas bien compris ce que tu veux faire, tu pourrais essayer de
reformuler ?

En assumant que ce que j’ai compris est juste, tu essaye de trouver quoi
?

  • toutes les vidéos qui sont liées à au moins un objet du modèle Un,
    toutes les vidéos qui sont liées à au moins un objet du modèle Deux,
    ou
    toutes les vidéos qui sont liées à un objet du modèle Trois ?
  • toutes les vidéos qui sont liées à au moins un objet des modèles
    Un,
    Deux ou Trois ?
  • toutes les vidéos qui sont liées à un objet précis des modèles Un,
    Deux
    ou Trois ?
  • tous les objets du modèle Un, Deux, ou Trois auxquels sont liés au
    moins une vidéo ?
  • tous les objets du modèle Un, Deux, ou Trois auxquels sont liéss
    une
    vidéo précise ?

Je n’ai pas épuisé toutes les possibilités, essaye de préciser un peu…


Michel B.

Je vais prendre un exemple p-e plus claire :)…

j’ai un model “Video”.
j’ai aussi trois model : “Auteur”, “Difficulte” et “logiciel”

Dans “Video” j’ai un habtm du type :
Has_and_belongs_to_many :auteurs, :difficultes, :logiciels
et dans chacun de ces trois model j’ai :
has_and_belongs_to_many :videos

Je cherche maintenant à trouver l’ensemble des “vidéos” qui ont comme
auteur “@auteur”, comme difficulte “@difficulte” et comme logiciel
@logiciel”…

Si je ne cherchais que les vidéos qui ont comme auteur “@auteur” je
ferais :
@auteur.videos.find(:all)…

Sauf que la je veux tout en même temps, soit qqch du style :
Video.find(:all).@auteur.@difficulte.@logiciel

Sauf que cette synthaxe ne marche pas !..

Une idée ?

merci.

On 24 août, 16:54, “Michel B.” [email protected]

LÃ je comprend mieux.

Le mieux est de faire quelque chose dans le genre :
Video.find :all, :include => [:auteurs, :logiciels, :difficultes],
:conditions => [“user_id = ?”, @user.id, “logiciel_id = ?”,
@logiciel.id,
“difficulte_id = ?”, @difficulte.id]

Mais je m’interroge quand même un peu sur la logique métier
sous-jacente.

Si par exemple l’idée est de faire des vidéos qui peuvent avoir
plusieurs
auteurs, la liaison habtm est ok.
Mais est-ce que la vidéo peut avoir plusieurs logiciels ? Et plusieurs
difficultés ?

Si par exemple une même vidéo ne peut avoir qu’une seule difficulté, ce
serait mieux qu’elle porte l’association avec une difficulte_id dans la
table vidéo, un belong_to :difficulte dans le modèle et un has_many
:video
dans le modèle Difficulte.

Même chose pour les logiciels.


Michel B.

2008/8/24 guillaume [email protected]:

Sauf que cette synthaxe ne marche pas !..

Une idée ?

Méthode brute : tu peux utiliser Video.find(:all, :include =>
[:auteurs, :logiciels, difficulte], :conditions => [“auteur_id =
:auteur_id AND difficulte_id = :difficulte_id AND logiciel_id =
:logiciel_id”, {:auteur_id => @auteur.id, :difficulte_id =>
@difficulte.id, :logiciel_id => @logiciel.id}).

Tu peux aussi utiliser un named_scope sur le modèle video pour laisser
ton code SQL dans les modèles. Je te conseille tout de même de
vérifier que tu as besoin d’instancier @auteur, @difficulte et
@logiciel

http://fabien.jakimowicz.com

C’est sûr, les named_scope sont beaucoup plus propre. Il n’empêche que
la
logique métier qui est décrite me semble un peu zarbi.


Michel B.

2008/8/24 Fabien J. [email protected]:

has_and_belongs_to_many :videos
Video.find(:all).@auteur.@difficulte.@logiciel
@difficulte.id, :logiciel_id => @logiciel.id}).

Tu peux aussi utiliser un named_scope sur le modèle video pour laisser
ton code SQL dans les modèles. Je te conseille tout de même de
vérifier que tu as besoin d’instancier @auteur, @difficulte et
@logiciel

plus lisible:

Video.find :all,
:include => [:auteurs, :logiciels, difficulte],
:conditions => [“auteur_id = :auteur_id
AND difficulte_id = :difficulte_id
AND logiciel_id = :logiciel_id”,
{:auteur_id => @auteur.id, :difficulte_id =>@difficulte.id,
:logiciel_id => @logiciel.id}


http://fabien.jakimowicz.com

Ne vous inquiétez pas, la logique metier est assuré sans soucis ;)…
elle est en prod et marche impec.
La c’est plus un exemple que un vraie cas, sinon c plus compliqué à
comprendre… mais je vous assure le HABTM est obligatoire pour ce que
je fais :)…

Je vais voir un peu le named_scope, jamais utilisé donc…

j’ai d’ailleurs trouvé ce plugin
http://www.inlet-media.de/acts_as_habtm_list

Il utilise justement un scope et une syntaxe plus clean comme :
Video.find(:all).@systeme.@logiciel.@auteur

Cependant ce n’est pas parfait, et en plus il utilise des list dedans
mais bon…
Ce que je comprend pas c’est pouquoi rails nous propose la syntaxe si
simple : @auteur.videos.find(:all) mais lorsque on doit faire face à
plusieurs habtm il n’y a plus rien de très très clean… ou alors on
loupe qqch !

On 24 août, 17:29, “Michel B.” [email protected]