¿Cómo obtener registro creado hoy por rails activerecord?


¿Cómo debo escribir la instrucción condicional para cuando quiero obtener todos los registros que se crearon hoy?

Author: Wes Foster, 2010-05-27

9 answers

Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)

PS: Esta respuesta ha sido modificada ya que la respuesta de Harish Shetty era mejor que la mía. Como mi respuesta es aceptada una. He actualizado esta respuesta para el apoyo de la comunidad

 185
Author: Mohit Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-03 21:17:37

Sé que esta pregunta tiene una respuesta aceptada. La solución sugerida en la respuesta aceptada puede causar problemas de rendimiento cuando el tamaño de la tabla crece.

Normalmente, si realiza búsquedas basadas en la columna created_at, agregue un índice en la tabla en su archivo de migración.

add_index :posts, :created_at

Ahora, para buscar registros creados hoy:

Carriles 3/4

Post.where("created_at >= ?", Time.zone.now.beginning_of_day)

Para buscar publicaciones creadas en un día específico.

Post.where(:created_at => (date.beginning_of_day..date.end_of_day))

--------- O -------------

Agregue un método estático a su modelo

class Post < ActiveRecord::Base
  def self.today
    where("created_at >= ?", Time.zone.now.beginning_of_day)
  end
end

Post.today #returns posts today

Carriles 2

Post.all(:conditions => ["created_at >= ?", Time.zone.now.beginning_of_day])

--------- O -------------

Agregue un named_scope a su modelo

class Post < ActiveRecord::Base    
  named_scope :today, lambda { 
    {
      :conditions => ["created_at >= ?", Time.zone.now.beginning_of_day]
    }
  }
end

Post.today #returns posts today
 112
Author: Harish Shetty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-29 16:26:34

MySQL:

Model.all :condition => ["DATE(created_at) = ?", Date.today] # rails 2
Model.where("DATE(created_at) = ?", Date.today) # rails 3

PostgreSQL:

Model.all :condition => ["created_at::date = ?", Date.today] # rails 2
Model.where("created_at::date = ?", Date.today) # rails 3
 28
Author: jigfox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-05 09:45:25

Respuesta de Mohit Jain adaptada para Rails3

Model.where "DATE(created_at) = DATE(?)", Time.now
 15
Author: thekindofme,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-20 22:12:45

Modelo.rb

scope :posted_today, -> { posted_between_period(Time.now.midnight, Time.now.end_of_day) }

Posts_controller.rb

Post.posted_today
 6
Author: Parthiv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-11 06:03:59

Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)

Este "namescopes" el atributo con el table_name.

 6
Author: Rafael Oliveira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-24 21:27:37

Por alguna razón, ninguna de las otras soluciones en este post ni otras en StackOverflow funcionaron para mí (usando Rails 4.2.4 y Ruby 2.2.3p173). Esta es la única consulta que pude obtener para trabajar con mi base de datos Postgres:

Post.where("created_at >= TIMESTAMP 'now'")
 1
Author: Tim S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-06 10:32:01

Para consultar los registros que se crearon a partir de hoy

Usar scope con arel

class Post < ActiveRecord::Base    
  scope :create_from_today, -> {
    where(arel_table[:created_at].gteq(Time.zone.now.beginning_of_day))
  }
end

Usar ámbito con consulta raw

class Post < ActiveRecord::Base    
  scope :create_from_today, -> {
    where('created_at >= now()')
  }
end

Entonces podemos usarlo

today_posts = Post.created_from_today
 0
Author: Hieu Pham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-21 05:48:06

En rails 4.2.3 para obtener los registros creados hoy, usando mysql use lo siguiente.

@usergoals = Gol.where ("userid =: userid and Date (created_at) = :date", { userid: params[:id], date: Date.hoy })

Aquí estoy usando múltiples condiciones si lo desea, puede editarlo para una sola condición.

 -3
Author: santu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-12 06:38:33