Как мне написать условный оператор, если я хочу получить все записи, которые были созданы сегодня?
Как мне написать условный оператор, если я хочу получить все записи, которые были созданы сегодня?
Ответы:
Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
PS: Этот ответ был изменен, поскольку ответ Хариша Шетти был лучше моего. Как мой ответ принят один. Я обновил этот ответ для поддержки сообщества
Post.where("created_at >= ?", Time.zone.now.beginning_of_day)
очень умен, я бы поддержал Post.where(created_at: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
. Есть смысл действовать так, как вы можете управлять временем. Например, если вы тестируете, вы, вероятно, будете манипулировать временем, и тогда первый вариант не сработает. Вы хотите избежать такого рода возможных сбоев в будущем, которые могут потребовать некоторого времени на отладку.
Я знаю, что на этот вопрос есть принятый ответ. Решение, предложенное в принятом ответе, может вызвать проблемы с производительностью при увеличении размера таблицы.
Обычно, если вы выполняете поиск на основе 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
scope
пример в этом посте предназначен только для Rails 3, поскольку похоже, что он находится под заголовком Rails 2. В Rails 2 вам нужно будет использовать named_scope
вместо scope
. Кроме того, в Rails 3 вы могли бы эквивалентно использовать метод класса, def self.today where("created_at >= ?", Time.now.beginning_of_day) end
который, вероятно, чище, чем использование области видимости в этом случае, поскольку он позволяет вам отказаться от лямбда.
Ответ Мохита Джайна адаптирован для Rails3
Model.where "DATE(created_at) = DATE(?)", Time.now
В Rails 5.1 есть all_day
полезный помощник.
Post.where(created_at: Date.today.all_day)
или
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)
Это "именует" атрибут с расширением 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
выглядит интересно. Я не нашел к нему документации. Вы можете дать ссылку? Как рельсы выбирают столбик для сравнения?
По какой-то причине ни одно из других решений в этом посте и других решениях на StackOverflow у меня не сработало (с использованием Rails 4.2.4 и Ruby 2.2.3p173). Это единственный запрос, который я мог заставить работать с моей базой данных Postgres:
Post.where("created_at >= TIMESTAMP 'now'")
Для запроса записей, созданных с сегодняшнего дня
Используйте область видимости с arel
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
where('created_at >= now()')
найдет только те элементы, где в будущем был created_at.
.lteq(Time.zone.now.end_of_day))
.
В rails 4.2.3 для получения записей, созданных сегодня, с использованием mysql используйте следующее.
@usergoals = Goal.where ("userid =: userid and Date (created_at) =: date", {userid: params [: id], date: Date.today})
здесь я использую несколько условий, если вы хотите, вы можете отредактировать его для одного условия.