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.position
moved
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
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' –