🧚 Hör mal! Beekeeper Studio ist eine schnelle, moderne und Open-Source-Datenbank-GUI Download
12. September 2024 Von Matthew Rathbone

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 Zeitstempel created_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:

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.

Die Linux-Version von Beekeeper hat 100% des Funktionsumfangs, ohne Abstriche und ohne Kompromisse.

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.“
— Alex K., Datenbankentwickler
★★★★★
„Ich habe schon viele Datenbank-GUIs ausprobiert, aber Beekeeper trifft genau die richtige Balance zwischen Funktionen und Einfachheit. Es funktioniert einfach.“
— Sarah M., Full Stack Engineer

Bereit, deinen SQL-Workflow zu verbessern?

download Kostenlos herunterladen