2012-05-15 5 views
1

Supposons que j'ai les modèles suivants:Rails 3 Nested requêtes SQL éviter

class Foo < ActiveRecord::Base 
    belongs_to :bar 
end 

class Bar < ActiveRecord::Base 
    belongs_to :a 
    belongs_to :b 
end 

Je veux trouver tous les Foos, y compris Bar et le regroupement par a_id et b_id.

Je suis assez sûr que la requête suivante fonctionnera:

Foo.joins(:bar).group('bar.a_id, bar.b_id').all 

Je me demande s'il y a un moyen de le faire sans écrire le SQL dans la déclaration du groupe?

question Sous

Quel est ce style de requête appelé et où puis-je lire la documentation complète de celui-ci? Le guide de requête rails a un mélange de plusieurs styles et ne va pas dans les moindres détails à propos de l'un d'eux.

Répondre

1

Le mélange de styles est dû au fait que les styles utilisant des hachages ne peuvent pas actuellement décrire toutes les requêtes SQL possibles. Ainsi, il y a toujours le repli de l'utilisation des chaînes.

La requête que vous avez donnée fonctionne, et il n'y a aucune raison de ne pas l'utiliser, car la chaîne est très standard SQL, et ne devrait pas échouer si une base de données différente est utilisée.

Il est toutefois possible de l'écrire sans chaînes. Notez que votre requête actuelle telle que écrite va générer une erreur puisque tous les champs de Foo sont sélectionnés par défaut - cependant avec group, vous ne pouvez sélectionner que des fonctions agrégées ou le groupe par colonnes.

La requête serait quelque chose comme:

Foo.select("COUNT(*) as count").joins(:bar).group([:bar => :a_id, :bar => :b_id]) 

Je viens d'ajouter la clause select de sorte que seule une fonction d'agrégation est sélectionnée.