2017-01-12 23 views
0

Ich versuche, eine Activerecord-Abfrage zu erstellen, die zählt alle events wo die position = move_left für einen bestimmten Benutzer, auf statuses verbunden, wenn die status entweder moved oder moved_correct ist. Das Problem, mit dem ich Probleme habe, ist, dass meine events mehr als einen Datensatz mit denselben Daten für einen bestimmten Benutzer haben kann, da es sich um Ereignisse handelt und Sie dasselbe Ereignis mehrmals durchführen können.Active deutliche zählen, wenn Tabellen verknüpft

Meine zwei Modelle:

Veranstaltung:

belongs_to :user 
belongs_to :status 

Status:

belongs_to :user 
has_many :events 

Da mehrere Benutzer gibt es, ich brauche die letzte erstellt event für jeden bestimmten Benutzer zu erhalten, und kommen auf statuses, wobei die statuses.positionmoved oder moved_correct ist.

SELECT `events`.* FROM `events` ORDER BY `events`.`id` DESC 

=> <Event id: 1, user_id: 1, position: "move_left"> 
=> <Event id: 2, user_id: 1, position: "right"> 
=> <Event id: 3, user_id: 1, position: "move_left"> 

=> <Event id: 4, user_id: 2, position: "move_left"> 
=> <Event id: 5, user_id: 2, position: "right"> 
=> <Event id: 6, user_id: 3, position: "right"> 

..

SELECT `statuses`.* FROM `statuses` ORDER BY `statuses`.`id` DESC 

=> <Status id: 1, status_now: "moved", user_id: 1> 
=> <Status id: 2, status_now: "moved_correct", user_id: 1> 

=> <Status id: 3, status_now: "moved", user_id: 2> 
=> <Status id: 4, status_now: "moved_correct", user_id: 3> 
=> <Status id: 5, status_now: "moved_down", user_id: 3> 

Mit, dass Beispieldaten, die Gesamtzahl ich erwarten würde würde 4 (1 user_id: 1 kehrt 2, user_id: 2 kehrt, user_id: 3 kehrt 1) zu sehen sein

Diese ist eine Beispielfrage, wie ich es mir vorgestellt habe, aber ich bin mir nicht sicher, wo ich falsch liege. Jede Hilfe würde sehr geschätzt werden!

Event.select(:user_id).distinct.order(id: :desc).first.joins("JOIN statuses ON events.user_id = statuses.user_id AND 
statuses.status_now IN ('moved', 'moved_correct')").count 

Antwort

0

Nach meiner Annahme Ihrer bestimmten Szenario dies versuchen:

Event.joins(:user).joins(:status) 
.where("statuses.status_now IN ('moved', 'moved_correct') AND events.position = 'move_left')" 
.distinct.count("events.id") 
+0

Dies scheint nicht richtig zu funktionieren. Zur Klärung suche ich nach etwas mehr wie: SELECT DISTINCT COUNT (DISTINCT statuses.id) FROM 'events' INNER JOIN' status' ON ​​'status''user_id' =' activity_events' 'user_id' WHERE (statuses.status_now IN ('moved', 'moved_correct') UND events.position = 'move_left') - aber mit einer Anzahl von 'status' basierend auf der letzten eindeutigen' events.user_id' –

Verwandte Themen