SQL-Funktionen in Active Record verwenden
Die meisten SQL-Datenbanken bieten Funktionen, um Teile eines Datums zu extrahieren. PostgreSQL verwendet zum Beispiel EXTRACT(DOW FROM date), wobei DOW für „day of the week“ (Wochentag) steht und Werte von 0 (Sonntag) bis 6 (Samstag) zurückgibt.
Nehmen wir ein Task-Model mit einer Spalte created_at. Unser Ziel ist es, nur Datensätze abzurufen, die an Wochentagen erstellt wurden. Dafür nutzen wir die Abfragefunktionen von Active Record.
# app/models/task.rb
class Task < ApplicationRecord
scope :weekdays_only, -> { where("EXTRACT(DOW FROM created_at) BETWEEN 1 AND 5") }
end
Erklärung:
-
EXTRACT(DOW FROM created_at): Extrahiert den Wochentag aus dem Zeitstempelcreated_at. -
BETWEEN 1 AND 5: Beschränkt die Auswahl auf Montag bis Freitag.
Rubys Date-Methoden mit Active Record verwenden
Wenn du ausschließlich Rubys Date-Methoden nutzen willst, kannst du den Code so anpassen, dass die Datensätze erst nach dem Abruf aus der Datenbank gefiltert werden. Bei größeren Datenmengen ist das allerdings nicht effizient.
# app/models/task.rb
class Task < ApplicationRecord
def self.weekdays_only_ruby
all.select { |task| task.created_at.on_weekday? }
end
end
Erklärung:
- Diese Methode ruft zuerst alle Datensätze aus der Datenbank ab und filtert sie dann mit Rubys Methode
on_weekday?. -
task.created_at.on_weekday?: Wandelt den Zeitstempel created_at in ein Ruby-Date-Objekt um und prüft, ob es sich um einen Wochentag (Montag bis Freitag) handelt.
Anwendungsbeispiel:
Task.weekdays_only_ruby
Hinweis: Dieser Ansatz kann ineffizient sein, weil er zuerst alle Datensätze aus der Datenbank abruft und sie dann im Arbeitsspeicher verarbeitet. Er eignet sich für kleine Datenmengen. Wenn du mit größeren Datenmengen arbeitest, ist die SQL-Lösung deutlich effizienter.
Bedingungen in Active Record kombinieren
Vielleicht willst du Datensätze nach Wochentagen und zusätzlich nach einer bestimmten Bedingung filtern, etwa einem Status. Das geht, indem du Scopes verkettest:
# app/models/task.rb
class Task < ApplicationRecord
scope :weekdays_only, -> { where.not("EXTRACT(DOW FROM created_at) IN (0, 6)") }
scope :completed, -> { where(status: 'completed') }
end
Anwendungsbeispiel:
Task.weekdays_only.completed
Abfragen über verschiedene Zeitzonen hinweg
Wenn du mit Zeitzonen arbeitest, achte darauf, dass die created_at-Zeitstempel korrekt umgerechnet werden. Verwende die AT TIME ZONE-Klausel in SQL für genaue Vergleiche.
# app/models/task.rb
class Task < ApplicationRecord
scope :weekdays_only_in_timezone, ->(timezone) {
where("EXTRACT(DOW FROM created_at AT TIME ZONE ?) BETWEEN 1 AND 5", timezone)
}
end
Anwendungsbeispiel:
Task.weekdays_only_in_timezone('UTC')
Andere Datenbanken
Verschiedene SQL-Datenbanken verwenden unter Umständen unterschiedliche Funktionen, um Datumsteile zu extrahieren:
- MySQL:
DAYOFWEEK(created_at) - SQLite:
strftime('%w', created_at)
Passe deine Abfragen an die jeweils verwendete Datenbank an:
# Example for MySQL
scope :weekdays_only, -> { where("DAYOFWEEK(created_at) BETWEEN 2 AND 6") }
Nachdem du diese Scopes implementiert hast, liefert eine Abfrage mit Task.weekdays_only eine Sammlung von Tasks, die nur an Wochentagen erstellt wurden. Hier ein Beispiel:
tasks = Task.weekdays_only
tasks.each do |task|
puts task.created_at
end
Ausgabe:
2024-08-26 10:30:00 UTC # Monday
2024-08-27 11:45:00 UTC # Tuesday
2024-08-28 09:00:00 UTC # Wednesday
Fazit
Active-Record-Ergebnisse auf Wochentage zu beschränken ist ganz einfach, wenn du SQL-Funktionen und Ruby-Methoden nutzt, um Teile eines Datums zu extrahieren.
Weitere Artikel, die dir gefallen könnten:
- So extrahierst du Tage, Stunden oder Minuten insgesamt in PostgreSQL
- So erstellst du Diagramme mit Ruby on Rails
Beekeeper Studio ist eine kostenlose & quelloffene Datenbank-GUI
Das beste SQL-Abfrage- & Editor-Tool, das ich je benutzt habe. Es bietet alles, was ich zum Verwalten meiner Datenbank brauche. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio ist schnell, intuitiv und einfach zu bedienen. Beekeeper unterstützt jede Menge Datenbanken und läuft hervorragend auf Windows, Mac und Linux.
Was Nutzer über Beekeeper Studio sagen
„Beekeeper Studio hat meinen alten SQL-Workflow komplett ersetzt. Es ist schnell, intuitiv und macht die Arbeit mit Datenbanken wieder zum Vergnügen.“
„Ich habe schon viele Datenbank-GUIs ausprobiert, aber Beekeeper trifft genau die richtige Balance zwischen Funktionen und Einfachheit. Es funktioniert einfach.“