2016-07-28 10 views
0

In meinem Modell mir den Geltungsbereich definiert:Schienen konvertieren Datetime Datum innerhalb eines Bereichs

scope :today, -> { where time_start: Date.today } 

Das funktioniert nicht, weil ich einen MySQL-Datetime gegen ein Datum zu vergleichen. Ich versuche, das Äquivalent der Funktion date() mysql zu tun (das Extrahieren eines Datums aus einer Datetime).

Antwort

0

Versuchen Sie folgendes:

scope :today, -> { where time_start: Date.today.beginning_of_day..Date.today.end_of_day } 

Bereich Verwendung in Kriterien eine BETWEEN Abfrage, so etwas wie diese erzeugen:

SELECT "models".* FROM "models" 
    WHERE (
     "models"."time_start" BETWEEN 
      '2016-07-29 00:00:00.000000' AND '2016-07-29 23:59:59.999999' 
    ) 
+0

Dank Nic, dachte ich über diese Lösung, aber es fühlte sich wie ein Hack – mrtnmgs

+0

Dies ist in keiner Weise ein Hack. In der Tat würden viele argumentieren, dass dies eine Methode von Rails ist, im Gegensatz zur Verwendung von rohen und möglicherweise herstellerspezifischen Strings in der Abfrage. –

+0

ooh toller Punkt! Ich werde die angenommene Antwort ändern. Danke noch einmal! – mrtnmgs

2

Als Nic Nilov vorgeschlagen, das ist eine Möglichkeit, dies zu tun.
Andere Weise können Sie tun:

scope :today, -> { where("date(time_start) = ?", Date.today) } 

Resultierende Abfrage wäre:

users SELECT * FROM users WHERE (Datum (TIME_START) = '2016.07.29')

.
0

Ich habe ein Juwel namens by_star, mit dem Sie das tun können, ohne Code in Ihr Modell zu schreiben.

Dieser Code:

User.today 

Werden alle Benutzer innerhalb des aktuellen Tages erstellt holen. Wenn Sie stattdessen time_start verwenden möchten, dies tun:

User.today(field: :time_start)