11
votes

Rails Poulie du nombre d'enfants dans la relation HAS_MANY

essayer de faire une portée dans les rails3.

:book has_many :chapters 


1 commentaires

Pouvez-vous décrire / le message avec la base de données que vous utilisez? Je crois que cela causait une certaine confusion dans les réponses ci-dessous


4 Réponses :


19
votes

Cela devrait vous aider à aller:

class Book
  scope :long, joins(:chapters).
                 select('books.id, count(chapters.id) as n_chapters').
                 group('books.id').
                 having('n_chapters > 10')
end


3 commentaires

C'est la voie à suivre. Seul le problème que je rencontre est que la méthode de comptage ne fonctionne pas vraiment comme prévu ici. Par exemple, book.long.count retourne un hachage avec le nombre de chapitres pour chaque livre, je pense. Vous devez faire book.long.all.count. Pas trop mal je suppose


Cela a l'air bien, mais je reçois une erreur: 'Colonne "Card_Count" n'existe pas' (Card_Count est mes N_Chapters). Tout par le ayant semble fonctionner correctement et la colonne CARD_COUNT est définitivement peuplée lorsque je l'exécute directement dans une console SQL ...


Je ne sais pas si c'est une bonne pratique de relier d'autres postes Stackoverflow. Mais j'ai un problème similaire à ce post, mais cela ne nécessite que certains attributs sur les objets HAS_MANY. J'apprécierais vraiment l'aide Stackoverflow.com/Questtions/31719184/...



8
votes

AH - Pour répondre à ma propre question dans le commentaire ci-dessus, j'ai dû mettre le comptage dans l'avoir: xxx


0 commentaires

1
votes

in rails 4.0 Cette version fonctionne. Vous devez compter () dans la clause d'avoir la clause. Il semble que la clause ne se voit pas «comme N_Chafters».


0 commentaires

0
votes

Une alternative est de faire une sous-requête. Bien que la jointure soit plus correcte (et cela conduit éventuellement à de meilleures performances), vous risquez de vous retrouver avec des résultats étranges si vous combinez plusieurs étendues qui essaient de regrouper. Une sous-requête est beaucoup moins intrusive. Pour cet exemple, ce serait quelque chose comme: xxx


0 commentaires