2017-09-14 4 views
1

Chaque ticket a 2 intervalles de temps.Comment regrouper par sur une autre colonne de modèle avec des rails de relation

ticket.rb:

has_many :timeslots, through: :visits 

visit.rb:

has_many :tickets 
belongs_to :timeslot 

timeslot.rb:

has_many :visits 
belongs_to :ticket 

Ce que je dois faire est de les intervalles de temps chaque billet dans la groupe de 2. Donc

Ticket A - timeslot 1 
Ticket A - timeslot 2 
Ticket B - timeslot 1 
Ticket B - timeslot 2 

requête que je suis en train est:

Ticket.where(:zone_id => 1).includes(:user).joins(timeslots: 
:visits).group_by("visits.ticket_id") 

Mais il est dit:

ArgumentError: wrong number of arguments (1 for 0) 

Répondre

0

group_by est une méthode rubis attend un bloc (doc: https://ruby-doc.org/core-2.2.3/Enumerable.html#method-i-group_by)

Le SQL GROUP BY est fourni par la méthode group de ActiveRecord (doc: http://guides.rubyonrails.org/active_record_querying.html#group)

Dans votre cas, cela devrait fonctionner:

Ticket.where(:zone_id => 1) 
     .includes(:user) 
     .joins(timeslots: :visits) 
     .group("visits.ticket_id") 
+0

Il dit: 'PG :: GroupingError: ERREUR: la colonne "tickets.id" doit apparaître dans la clause GROUP BY ou être utilisé dans une fonction d'agrégation ' – LearningROR

+0

Le problème est que vous avez plusieurs enregistrements Ticket pour un seul ticket_id, et dans PostgreSQL il se plaint de ne pas pouvoir décider quel enregistrement de ticket il doit sélectionner. C'est pourquoi vous devez utiliser une fonction 'aggregate' pour indiquer à PostgreSQL quel Ticket sélectionner (ex: 'max (tickets.id)'), mais cela ne résoudra pas votre problème. Pouvez-vous expliquer exactement ce que vous voulez et attendez? Pas seulement sur le niveau db mais aussi sur le niveau utilisateur final (côté frontal ou côté API) – MrYoshiji

+0

Merci beaucoup Sir Yoshiji. Je suis finalement fait avec la solution du problème. :-) – LearningROR