Come devo scrivere la dichiarazione condizionale per quando voglio ottenere tutti i record che sono stati creati oggi?
Come devo scrivere la dichiarazione condizionale per quando voglio ottenere tutti i record che sono stati creati oggi?
Risposte:
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
PS: questa risposta è stata modificata in quanto la risposta di Harish Shetty era migliore della mia. Poiché la mia risposta è accettata una. Ho aggiornato questa risposta per il supporto della comunità
Post.where("created_at >= ?", Time.zone.now.beginning_of_day)
è molto intelligente, lo appoggerei Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
. C'è un punto per fare in un modo in cui puoi manipolare il tempo. Ad esempio, se stai testando, probabilmente manipolerai il tempo e quindi la prima opzione non funzionerà. Si desidera evitare quel tipo di possibile guasto futuro che probabilmente richiederà un po 'di tempo per il debug.
So che questa domanda ha una risposta accettata. La soluzione suggerita nella risposta accettata può causare problemi di prestazioni quando la dimensione della tabella aumenta.
In genere, se esegui ricerche in base alla created_at
colonna, aggiungi un indice alla tabella nel file di migrazione.
add_index :posts, :created_at
Ora, per cercare i record creati oggi:
Rotaie 3/4
Post.where("created_at >= ?", Time.zone.now.beginning_of_day)
Per cercare i post creati in un giorno specifico.
Post.where(:created_at => (date.beginning_of_day..date.end_of_day))
--------- OPPURE -------------
Aggiungi un metodo statico al tuo modello
class Post < ActiveRecord::Base
def self.today
where("created_at >= ?", Time.zone.now.beginning_of_day)
end
end
Post.today #returns posts today
Rotaie 2
Post.all(:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day])
--------- OPPURE -------------
Aggiungi un named_scope al tuo modello
class Post < ActiveRecord::Base
named_scope :today, lambda {
{
:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day]
}
}
end
Post.today #returns posts today
scope
esempio in questo post è solo per Rails 3, poiché sembra che si trovi sotto l'intestazione Rails 2. In Rails 2, dovresti usare named_scope
invece di scope
. Inoltre, in Rails 3, potresti utilizzare in modo equivalente un metodo di classe def self.today where("created_at >= ?", Time.now.beginning_of_day) end
che è probabilmente più pulito rispetto all'utilizzo di uno scope in questo caso, poiché ti consente di rinunciare al lambda.
La risposta di Mohit Jain adattata per Rails3
Model.where "DATE(created_at) = DATE(?)", Time.now
Rails 5.1 ha un all_day
helper che è utile qui.
Post.where(created_at: Date.today.all_day)
o
Post.where(created_at: Date.parse("YYYY-MM-DD").all_day)
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
Questo "individua" l'attributo con table_name
.
model.rb
scope :posted_today, -> { posted_between_period(Time.now.midnight, Time.now.end_of_day) }
posts_controller.rb
Post.posted_today
between_period
sembra interessante. Non ho trovato alcuna documentazione per questo. Puoi fornire qualche link? In che modo i binari scelgono la colonna per il confronto?
Per interrogare i record creati da oggi
Usa l'ambito con arel
class Post < ActiveRecord::Base
scope :create_from_today, -> {
where(arel_table[:created_at].gteq(Time.zone.now.beginning_of_day))
}
end
Quindi possiamo usarlo
today_posts = Post.created_from_today
where('created_at >= now()')
troverà solo gli elementi in cui created_at era in futuro.
.lteq(Time.zone.now.end_of_day))
anche tu .
In rails 4.2.3 per ottenere i record creati oggi, utilizzando mysql utilizzare quanto segue.
@usergoals = Goal.where ("userid =: userid and Date (created_at) =: date", {userid: params [: id], date: Date.today})
qui sto usando più condizioni se vuoi puoi modificarlo per una singola condizione.