2011-05-10 18 views
25

Ho una tabella di offerte e ho bisogno di trovare i record in cui la data corrisponde alla data odierna.Trova record con Datetime corrispondenti alla data odierna - Ruby on Rails

Dalla console di rails, il campo della data che devo corrispondere è simile a questo. Ho assegnato un record da trattare per i test.

ruby-1.9.2-p0 > deal.start 
=> Tue, 10 May 2011 00:00:00 UTC +00:00 

Se cerco di trovare tutti i record corrispondenti alla data di inizio con l'oggi in questo modo ottengo nulla

ruby-1.9.2-p0 > Deal.find_by_start(Date.today) 
=> nil 

poi ho pensato che avrei potuto abbinare convertendo Date.today ad un datetime.

ruby-1.9.2-p0 > Date.today.to_datetime 
=> Tue, 10 May 2011 00:00:00 +0000 
ruby-1.9.2-p0 > Deal.find_by_start(Date.today.to_datetime) 
=> nil 

Come posso farlo funzionare? Sto usando Rails 3.

Edit: ho pensato a loro sia la conversione in un formato coerente, che saranno le opere, ma non quando si cerca di utilizzare il metodo di find_by_start

ruby-1.9.2-p0 > deal.start.strftime("%a, %e %B %Y") == Date.today.strftime("%a, %e %B %Y") 
=> true 

ruby-1.9.2-p0 > Deal.find_by_start.strftime("%a, %e %B %Y") == Date.today.strftime("%a, %e %B %Y") 
NoMethodError: undefined method `strftime' for nil:NilClass 

risposta

46

tenere a mente DateTime detiene una data e ora, quindi stai cercando record con un valore preciso, non solo lo stesso giorno.

È possibile eseguire questa operazione in due modi. È possibile selezionare l'intervallo di tempo dall'inizio del giorno fino alla fine oppure creare una colonna date per facilitare il raggruppamento dei dati.

versione La gamma si presenta così:

@deals = Deal.where('start BETWEEN ? AND ?', DateTime.now.beginning_of_day, DateTime.now.end_of_day).all 

L'altro richiede la creazione di un nuovo start_date colonna della tabella e lo ha popolato con le date di conseguenza. Puoi indicizzare questa data e far sì che le query vengano eseguite molto più rapidamente, poiché le selezioni di intervalli non sono sempre rapide su grandi set di dati.

+0

Grazie. Funziona alla grande e userò questo a breve termine e guarderò il refactoring del mio codice per migliorare le prestazioni. Grazie per l'aiuto. –

+12

Esiste anche una versione più succinta che utilizza gli intervalli. @deals = Deal.where (inizio: DateTime.now.beginning_of_day .. DateTime.now.end_of_day) –

+0

Sto trovando che 'Deal.where (start: Time.zone.now.midnight)' funziona anche. –

23

Rails 5.1 ha introdotto Date#all_day aiutante, che restituisce un oggetto Range per una determinata data, in modo da poter basta scrivere:

Deal.where(start: Date.today.all_day) 

È inoltre possibile utilizzare la funzione SQL DATE() per il tuo obiettivo, ad esempio:

@deals = Deal.where('DATE(start) = ?', Date.today) 
2

Per coloro che ancora on Rails 4:

per aumentare la risposta di not_a_patch sopra, userebbe:

Deal.where(start: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day) 

perché Time.zone utilizzerà UTC (che è come il vostro campo data ora viene memorizzata) mentre DateTime.now non lo faranno.

> DateTime.now 
=> Fri, 08 Sep 2017 11:28:21 -0400 
> Time.zone.now 
=> Fri, 08 Sep 2017 15:29:53 UTC +00:00 
Problemi correlati