Как мне написать условный оператор для того, когда я хочу получить все записи, которые были созданы сегодня?
Как получить запись, созданную сегодня с помощью rails activerecord?
Ответ 1
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
PS: Этот ответ был изменен, так как ответ Хариш Шетти был лучше, чем мой. В качестве моего ответа принимается один. Я обновил этот ответ для поддержки сообщества
Ответ 2
Я знаю, что этот вопрос имеет принятый ответ. Решение, предложенное в принятом ответе, может вызвать проблемы с производительностью при увеличении размера таблицы.
Обычно, если вы выполняете поиск на основе столбца 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
Ответ 3
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
Ответ 4
Ответ Mohit Jain адаптирован для Rails3
Model.where "DATE(created_at) = DATE(?)", Time.now
Ответ 5
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
Этот "индексирует" атрибут с помощью table_name
.
Ответ 6
model.rb
scope :posted_today, -> { posted_between_period(Time.now.midnight, Time.now.end_of_day) }
posts_controller.rb
Post.posted_today
Ответ 7
В Rails 5.1 есть помощник all_day
, полезный здесь.
Post.where(created_at: Date.today.all_day)
или же
Post.where(created_at: Date.parse("YYYY-MM-DD").all_day)
Ответ 8
По какой-то причине ни одно из других решений в этом сообщении и других в StackOverflow не работало для меня (используя Rails 4.2.4 и Ruby 2.2.3p173). Это единственный запрос, который я мог бы получить для работы с моей базой данных Postgres:
Post.where("created_at >= TIMESTAMP 'now'")
Ответ 9
Для запроса записей, которые созданы с сегодняшнего дня
Используйте область с арлом
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
Ответ 10
В рельсах 4.2.3 для создания созданных сегодня записей, используя mysql, используйте следующее.
@usergoals = Goal.where( "userid =: userid и Date (created_at) =: date", {userid: params [: id], date: Date.today})
здесь я использую несколько условий, если вы хотите, чтобы их можно было отредактировать для одного условия.