如何根据rails中的updated_at查找记录

问题描述 投票:0回答:4

我必须根据其 Updated_at 列找到记录。为此,我将 Updated_at 与今天的日期进行比较。 我厌倦了以下方式,但它不起作用

todays_date = Date.today.strftime("%m/%d/%Y")
obj = MyClass.where(:updated_at.strftime("%m/%d/%Y")=> todays_date )

但是它不起作用。我该怎么做?

ruby-on-rails ruby ruby-on-rails-3
4个回答
4
投票

试试这个代码...

obj = MyClass.where("updated_at >= ? AND updated_at <= ?",Date.today.to_time.beginning_of_day,Date.today.to_time.end_of_day)

下面的代码将不起作用,因为 :updated_at 是符号而不是对象(语法错误)。

:updated_at.strftime("%m/%d/%Y")

2
投票

一些额外的解释对于评论来说太长了:

你需要清楚ruby中的时间和数据库中的时间之间的区别。 在 ruby 中,时间或日期是 Time/Date 对象的实例。 您可以像此处一样使用 strftime 将其转换为字符串。

在数据库中,它有效地存储为字符串,但由于列类型设置为日期时间,因此您可以在 SQL 中调用一些额外的函数(此函数列表将根据您使用的 DBMS - mysql 、postgres 等)。 存储在数据库中的日期时间字符串的格式将再次根据 DBMS 的不同而有所不同。

如果您将 Todays_date 作为实际日期对象(而不是字符串),则可以将其直接传递到

.where
,rails 会将其转换为结果 sql 查询的适当格式的字符串。

例如,

 my_date = Date.today #this is a Date object
 obj = MyClass.where(:updated_at => my_date)

此时,rails 构建了一个 sql 查询。 查询只是在 sql 中调用的字符串,因此所有不是字符串的内容都会被“翻译”为字符串形式。 如果数据库列是日期时间 以 mysql 为例,sql 是

select * from my_classes where updated_at = "2014-05-09";

请注意,即使我们通过了一个日期

当您自己将日期转换为字符串时,您可能会使用不正确的格式。 例如,如果你要这样做

obj = MyClass.where(:updated_at => my_date.strftime("%m/%d/%Y"))

那么 Rails 已经获取了一个字符串作为查询的值,并且它不会尝试翻译它。  你最终会得到这个sql:

select * from my_classes where updated_at = "09/05/2014;

而且,由于您的数据库不以该格式存储日期,因此您不会获得任何匹配项。

您可以通过调用

.to_s(:db)

来查看日期如何转换为数据库格式。 这揭示了日期和时间之间的差异:


Date.today.to_s(:db) => "2014-05-09" Date.today.to_time.to_s(:db) => "2014-05-09 00:00:00"

它还揭示了大于/小于比较的工作原理:这只是字符串比较!  由于日期和时间按照最重要元素在前(年、月、日、小时、分钟、秒)的顺序存储,因此日期比较只是字符串比较。  即,比较“2012-10-15”和“2014-05-09”就像比较“abcdef”和“abcxyz”(“abcxyz”比“abcdef”“更高”,因为“x”比“abcdef”“更高”) “d”)。 

这还允许比较日期和日期时间:

“2014-05-09 01:00:00”比“2014-05-09”“更高”,因为如果两个字符串之间存在“平局”,直到其中一个字符串的末尾,即具有更多字符的字符串被视为“较高”。 这很有帮助,因为给定日期的任何特定时间都被认为是在当天的日期之后(即高于)。


1
投票

obj = MyClass.where("updated_at >= ?",Date.today)

还可以使用:

obj = MyClass.where("updated_at >= ?",Date.today.beginning_of_day)

希望有帮助:)


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.