Ich habe einen Hintergrund-Job, der alle 15 Minuten läuft und generiert Erinnerungs-E-Mails. Ich möchte eine Abfrage erstellen, die alle Benutzer zurückgibt, die eine bestimmte Zeit gespeichert haben und respektieren, wie ihre Zeitzoneneinstellung diese Zeit beeinflusst.Rails: Abfrage Datenbank für Benutzer mit bestimmten Zeitwert unter Berücksichtigung der einzelnen Benutzer Zeitzone Einstellung
So habe ich ein User
Modell, das speichert:
:time
: eine Benutzer Erinnerungszeit, zB17:00:00
:string
: ihre Zeitzone, zBEST
Also, wenn der Auftrag ausgeführt 17:00:00
EST, gibt es Benutzer mit folgenden Einstellungen zurück:
reminder_time: 17:00:00
,time_zone: EST
reminder_time: 13:00:00
,time_zone: PST
Was ist der beste Weg, um die Abfrage zu erstellen? Kann es in einem einzigen Schritt erledigt werden, wenn man sich darauf verlässt, dass Postgres mit der Arbeit fertig wird? Muss ich es staffeln, nach jeder Zeitzone gruppieren und für jeden in Ruby rechnen?
Ich habe derzeit dieses Setup als Bereich, die Zeitzonen nicht berücksichtigt, und ich versuche, diese Überlegung jetzt hinzuzufügen.
scope :receives_reminder_at, -> (time) do
ready.where(reminder_time: time)
end
speichern nur die REMINDER_TIME in UTC, auf diese Weise müssen Sie über die TZ keine Sorge bei der Abfrage, da werden sie alle UTC normalisiert werden. (Vorausgesetzt, Sie laufen Ihre Server UTC. Es wird nur wie erwartet funktionieren). Dann verwenden Sie einfach ihren TZ-Offset, um die Zeit für das Anzeigen einzustellen? – Doon
Ich wollte gerade das als Antwort schreiben, nachdem ich mit einem Kumpel von mir gesprochen hatte. Setzen Sie das als eine Antwort unten, und ich werde sicher sein, es zu markieren – mattmcmanus