Angenommen, Ihr "Datumsattribut" ist ein Datum (und kein vollständiger Zeitstempel), dann erhalten Sie mit einem einfachen where"Suchen nach Datum":
Model.where(:date_column => date)
Sie wollen nicht, find_by_date_columnda dies höchstens ein Ergebnis liefert.
Für die Abfragen für Jahr, Monat und Tag möchten Sie die extractSQL-Funktion verwenden:
Model.where('extract(year from date_column) = ?', desired_year)
Model.where('extract(month from date_column) = ?', desired_month)
Model.where('extract(day from date_column) = ?', desired_day_of_month)
Wenn Sie jedoch SQLite verwenden, müssen Sie damit herumspielen, strftimeda es nicht weiß, was es extractist:
Model.where("cast(strftime('%Y', date_column) as int) = ?", desired_year)
Model.where("cast(strftime('%m', date_column) as int) = ?", desired_month)
Model.where("cast(strftime('%d', date_column) as int) = ?", desired_day_of_month)
Die %mund %dFormat-Spezifizierer fügen in einigen Fällen führende Nullen hinzu, was die Gleichheitstests verwirren kann, daher müssen cast(... as int)die formatierten Zeichenfolgen zu Zahlen gezwungen werden.
ActiveRecord schützt Sie nicht vor allen Unterschieden zwischen Datenbanken. Sobald Sie also etwas Nicht-Triviales tun, müssen Sie entweder eine eigene Portabilitätsschicht erstellen (hässlich, aber manchmal notwendig) und sich an eine begrenzte Anzahl von Datenbanken binden (realistisch, es sei denn Sie veröffentlichen etwas, das in einer beliebigen Datenbank ausgeführt werden muss, oder führen Ihre gesamte Logik in Ruby aus (verrückt nach nicht trivialen Datenmengen).
Die Abfragen für Jahr, Monat und Tag des Monats sind in großen Tabellen ziemlich langsam. In einigen Datenbanken können Sie Indizes für Funktionsergebnisse hinzufügen, aber ActiveRecord ist zu dumm, um sie zu verstehen, sodass es zu einem großen Durcheinander kommt, wenn Sie versuchen, sie zu verwenden. Wenn Sie also feststellen, dass diese Abfragen zu langsam sind, müssen Sie die drei zusätzlichen Spalten hinzufügen, die Sie vermeiden möchten.
Wenn Sie diese Abfragen häufig verwenden, können Sie Bereiche für sie hinzufügen. Die empfohlene Methode zum Hinzufügen eines Bereichs mit einem Argument besteht jedoch darin, nur eine Klassenmethode hinzuzufügen:
Die Verwendung einer Klassenmethode ist die bevorzugte Methode, um Argumente für Bereiche zu akzeptieren. Auf diese Methoden kann weiterhin auf die Zuordnungsobjekte zugegriffen werden ...
Sie hätten also Klassenmethoden, die so aussehen:
def self.by_year(year)
where('extract(year from date_column) = ?', year)
end