L'association ActiveRecord sélectionne les enregistrements inclus
Exemple
class User
has_many :tickets
end
Je veux créer une association qui contient la logique de compter les billets de l'utilisateur et de l'utilisation qu'il en comprend (utilisateur has_one ticket_count)
Users.includes(:tickets_count)
J'ai essayé
has_one :tickets_count, :select => "COUNT(*) as tickets_count,tickets.user_id " ,:class_name => 'Ticket', :group => "tickets.user_id", :readonly => true
User.includes(:tickets_count)
ArgumentError: Unknown key: group
Dans ce cas, l'association de la requête à inclure doivent utiliser le comte avec le groupe ...
Comment puis-je mettre en œuvre cette aide de rails?
Mise à jour
- Je ne peux pas changer de structure de table
- Je veux AR générer 1 de la requête pour la collecte des utilisateurs avec comprend
Update2
Je sais SQL une je sais comment sélectionner ce avec des jointures, mais ma question est maintenant, comme "Comment obtenir des données" . Ma question est sur la construction de l'association que je peux utiliser en comprend. Grâce
Update3
J'ai essayé de créer une association créée comme utilisateur has_one ticket_count , mais
- ressemble has_one n'a pas d'association de soutien aux extensions
- has_one ne prend pas en charge :groupe option
- has_one ne prend pas en charge finder_sql
source d'informationauteur Fivell
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
Edit:
Il ressemble à la
has_one
association ne prend pas en charge lafinder_sql
option.Vous pouvez facilement obtenir ce que vous voulez en utilisant une combinaison de
scope
/class
méthodesMaintenant
Cette solution a des implications sur les performances si vous avez des millions de lignes dans la
tickets
table. Vous devriez envisager de filtrage de les JOINDRE ensemble de résultats en fournissantWHERE
à l'intérieur de la requête.Vous pouvez simplement utiliser pour un utilisateur particulier:
Ou si vous souhaitez que cette valeur automatiquement mises en cache par les Rails.
Déclarer un counter_cache => true option dans l'autre côté de l'association
Vous avez également besoin d'une colonne à vous utilisateur table nommée tickets_count.
Avec cela à chaque fois que vous ajoutez un nouveau billet pour un utilisateur rails de mise à jour de cette colonne alors, quand vous ftech votre enregistrement d'utilisateur, vous pouvez simplement accs cette colonne pour obtenir le billet compter sans requête supplémentaire.
Pas assez, mais il fonctionne:
Que sur l'ajout d'une méthode dans le modèle de l'Utilisateur qui effectue la requête?
Vous ne seriez pas en modifiant la structure de la table, ou vous ne pouvez pas modifier ce soit?