Как получить запись созданную сегодня рельсом activerecord? - PullRequest
105 голосов
/ 27 мая 2010

Как мне написать условное утверждение, когда я хочу получить все записи, которые были созданы сегодня?

Ответы [ 10 ]

202 голосов
/ 27 мая 2010
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)

PS: Этот ответ был изменен, так как Хариш Шетти был лучше моего. В качестве моего ответа принимается один. Я обновил этот ответ для поддержки сообщества

119 голосов
/ 26 марта 2012

Я знаю, что на этот вопрос есть принятый ответ. Решение, предложенное в принятом ответе, может вызвать проблемы с производительностью при увеличении размера таблицы.

Как правило, если вы выполняете поиск на основе столбца created_at, добавьте индекс в таблицу в файле миграции.

add_index :posts, :created_at

Теперь для просмотра записей, созданных сегодня:

Рельсы 3/4

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

Для просмотра сообщений, созданных в определенный день.

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

--------- ИЛИ -------------

Добавить статический метод в вашу модель

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

Post.today #returns posts today

Рельсы 2

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

--------- ИЛИ -------------

Добавьте named_scope к вашей модели

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

Post.today #returns posts today
29 голосов
/ 27 мая 2010

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
17 голосов
/ 21 августа 2012

Ответ Мохита Джайна адаптирован для Rails3

Model.where "DATE(created_at) = DATE(?)", Time.now
7 голосов
/ 25 сентября 2015

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

Это "namescopes" атрибут с table_name.

6 голосов
/ 26 февраля 2019

Rails 5.1 имеет all_day помощник, который полезен здесь.

Post.where(created_at: Date.today.all_day)

или

Post.where(created_at: Date.parse("YYYY-MM-DD").all_day)
5 голосов
/ 25 июня 2014

model.rb

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

posts_controller.rb

Post.posted_today
1 голос
/ 06 марта 2016

По какой-то причине ни одно из других решений в этом посте, ни другие в StackOverflow не работали для меня (используя Rails 4.2.4 и Ruby 2.2.3p173). Это единственный запрос, который я могу получить для работы с моей базой данных Postgres:

Post.where("created_at >= TIMESTAMP 'now'")
0 голосов
/ 21 мая 2016

Для запроса записей, созданных с сегодняшнего дня

Используйте область с арель

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

Тогда мы можем использовать его

today_posts = Post.created_from_today
0 голосов
/ 12 августа 2015

В rails 4.2.3 для получения записей, созданных сегодня, используя mysql, используйте следующее.

@ usergoals = Goal.where ("идентификатор пользователя =: идентификатор пользователя и дата (созданный) =: дата", {идентификатор пользователя: параметры [: идентификатор], дата: дата.день})

здесь я использую несколько условий, если вы хотите, вы можете отредактировать его для одного условия.

...