2013-02-06 3 views
0

J'ai un schéma DB complexe dans mon application Rails 2.3. À un certain point, j'ai besoin de faire une requête pour récupérer des données de plusieurs colonnes en joignant plusieurs tables. Il y a une table où je dois toujours passer pour récupérer les données dont j'ai besoin.joindre la même table plusieurs fois efficacement avec la syntaxe Rails

Le problème survient lorsque j'essaie d'utiliser la syntaxe Rails pour créer les jointures. Je n'ai trouvé aucun moyen de faire sauter les rails rejoignant la même table encore et encore.

Disons que j'ai cette relation de table:

A=>B=>C=>D=>E=>F 
A=>B=>F=>G 
A=>B=>F=>H 
A=>I 

Comme vous pouvez le voir, B est une table que je « joindre » à plusieurs reprises pour accéder aux tables dont j'ai besoin.

Ma requête ressemble à ceci:

A.all(:select=>"SOME DATA FROM F, G, H AND I", 
     :joins=>[{{{{:B=>:C}=>:D}=>:E}=>:F}, {{:B=>:F}=>:G}, {{:B=>:F}=>:H}, :I], 
     :conditions=>{"SOME CONDITIONS" 
        } 
    ) 

Vous pouvez voir que j'utilise la syntaxe de hachage pour spécifier les jointures.

Le problème est que lorsque je regarde la jointure que les rails créent, je vois qu'elle rejoint B 3 fois. Je m'attendrais à ce que ce soit assez intelligent pour le faire juste une fois et partir de là mais je suppose qu'il y a peut-être des cas où vous voulez vous joindre à plusieurs reprises.

Ma question est, comment puis-je, en utilisant la syntaxe rails 2.3.8, faire en sorte que la requête résultante vient de rejoindre B une seule fois. Ajout de relations supplémentaires dans le modèle de type: belongs_to: throug est pas une option pour moi

Répondre

1

essayer

A.all(:joins => [:I, { :B => [{ :F => [:G, :H] }, {:C => { :D => { :E => :F }}}]}]) 
+0

travaillé comme un charme! Merci! – yowie

Questions connexes