Ответ 1
Вероятно, вы хотите что-то вроде этого:
yesterday = Time.now - 1.day
user = User.find(user_id)
todaysReport = user.reports.where(["created_at >= ? AND created_at <= ?", yesterday.beginning_of_day, yesterday.end_of_day])
Итак, я пытаюсь сделать так:
today = Date.today - 1
todaysReport = Report.where(:created_at => today).find_by_user_id(user.id)
Проблема создана_at - это datetime, поэтому она не найдет совпадений. Какие-нибудь предложения?
Вероятно, вы хотите что-то вроде этого:
yesterday = Time.now - 1.day
user = User.find(user_id)
todaysReport = user.reports.where(["created_at >= ? AND created_at <= ?", yesterday.beginning_of_day, yesterday.end_of_day])
В postgres вы можете указать временную метку в качестве даты. Например:
Report.where("created_at::date = ?", Date.today - 1)
Вам нужно сравнить диапазон от одной полуночи до следующей. Кроме того, это хороший кандидат для создания собственного метода класса для большей гибкости.
class Report
# All reports created on the specified Date
def self.created_on(date)
where(['created_at >= ? AND created_at < ?', date, date + 1])
end
end
# Find all reports created yesterday by our user
Report.created_on(Date.today - 1).where(:user_id => user.id)
Он также может быть TimeWithZone, если часовой пояс указан в конфигурации приложения. Чтобы получить Date to TimeWithZone, вам нужно сделать как Date.today.to_time.in_time_zone.
Вы пытались использовать #to_datetime
, который Rails добавляет к классам Date
и Time
?
Report.where(:created_at => today.to_datetime).find_by_user_id(user.id)
На самом деле удивление AR не справляется с этим для вас.