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

时间:2014-05-09 11:27:40

标签: ruby-on-rails ruby ruby-on-rails-3

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

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

但它不起作用。我怎么能这样做?

3 个答案:

答案 0 :(得分: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")

答案 1 :(得分:1)

你可以简单地使用:

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

也可以使用:

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

希望有所帮助:)

答案 2 :(得分:1)

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

您需要清楚ruby中的时间与数据库中的时间之间的差异。在ruby中,时间或日期是时间/日期对象的实例。您可以像在这里一样将它转换为带有strftime的字符串。

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

如果你将todays_date作为一个实际的日期对象(不是字符串),你可以直接将它传递给.where,rails会将它转换为适当的fomatted字符串,用于生成的sql查询。

例如,

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

此时,rails构建了一个sql查询。查询只是一个要在sql中调用的字符串,因此不是字符串的所有内容都将被&#34;翻译&#34;成字符串形式。如果数据库列是日期时间

例如,在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"

它还揭示了比对比更大/更小的作用:它只是字符串比较!因为日期和时间按照最重要元素优先(年,月,日,小时,分钟,秒)的顺序存储,所以日期比较只是字符串比较。即,比较&#34; 2012-10-15&#34;和&#34; 2014-05-09&#34;就像比较&#34; abcdef&#34;和&#34; abcxyz&#34; (&#34; abcxyz&#34;比&#34;更高&#39; abcdef&#34;因为&#34; x&#34;比#34;更高&#34;比#34; d&#34)。

这也可以比较日期和日期时间:

&#34; 2014-05-09 01:00:00&#34;是&#34;更高&#34;比起#34; 2014-05-09&#34;,因为如果有&#34;领带&#34;在两个字符串之间直到其中一个字符串的末尾,具有更多字符的字符串被视为&#34;更高&#34;。这是有帮助的,因为某一天的任何特定时间都被认为是在该日的日期之后(即高于)。