抱歉,如果这个问题听起来很奇怪,但我正在深入研究Rails,我还在学习术语。基本上,我试图创建一个单遍查询,该查询在查询中的计算中使用模型的属性之一的值(假设这是可能的)。
我有一个Tournament
模型,它的start_date
属性是一个DateTime
对象。我试图创建一个查询,返回所有的比赛,有一个start_date不超过1小时+比赛的长度,或者换句话说,所有的比赛还没有开始或已经开始,但还没有结束超过一个小时前。我当前的查询,它不工作,看起来像这样…
validTourneys = Tournament.where("start_date > (? - duration_in_mins)", (DateTime.now.utc - 1.hour))
其中duration_in_mins
是锦标赛模型的整数属性,但此查询不起作用,并且似乎一直返回所有锦标赛。我想在计算的(DateTime.now.utc - 1.hour)
部分包括duration_in_mins
,但我不知道如何引用它,这就是为什么我把它包含在查询的字符串部分,希望能起作用。至少我在正确的轨道上吧?
我应该提到我正在使用SQLite进行开发,使用PostgreSQL进行生产。
谢谢你的智慧!
问题是,如果您从DateTime对象中减去分钟,您不是减去分钟,而是减去天。
# This works as expected
dt = DateTime.now # Thu, 28 Apr 2011 09:55:14 +0900
an_hour_ago = dt - 1.hour # Thu, 28 Apr 2011 08:55:14 +0900
# But, this does not...
two_hours_in_minutes = 120
two_hours_ago = dt - two_hours_in_minutes # Wed, 29 Dec 2010 09:55:14 +0900
在上一个示例中,减去120天而不是分钟。这可能也发生在您的查询中。您必须将duration_in_minutes
转换为天,然后减去。
我对SQL的了解不够,无法直接回答你的问题(我认为这可能还取决于你使用的是什么数据库,所以你可能想要提到这一点)。
你有没有考虑过,虽然,有start_date
和end_date
作为日期时间列,而不是start_date
和duration_in_mins
?如果这将是一个常见的查询,那么肯定会使其性能更高,并且使您的代码更容易阅读和理解。
这个查询只会工作,如果你的数据库足够聪明,知道如何添加(我假设)是一个DateTime和整数。我想不出有哪个数据库能按你的编码方式正确地做这些。没有数据库将假定分钟。有些可能是滴答、秒或天。
这部分计算
(? - duration_in_mins)
将发生在数据库上,而不是在Ruby-land中。