很抱歉,如果这个问题听起来很奇怪,但我正在深入研究Rails,我还在学习行话。基本上,我正在尝试创建一个单通道查询,该查询在查询的计算中使用模型属性之一的值(假设甚至可能)。
我有一个Tournament
模型,其start_date
属性是DateTime
个对象。我正在尝试创建一个返回所有锦标赛的查询,这些锦标赛的start_date不超过1小时+锦标赛的长度,或换句话说,所有锦标赛尚未开始或已经开始,但没有比一个小时前结束了。我当前的查询无效,看起来像这样......
validTourneys = Tournament.where("start_date > (? - duration_in_mins)", (DateTime.now.utc - 1.hour))
其中duration_in_mins
是锦标赛模型的整数属性,但此查询不起作用,似乎一直在返回所有锦标赛。我想在计算的duration_in_mins
部分中包含(DateTime.now.utc - 1.hour)
,但我不知道如何引用它,这就是为什么我将它包含在查询的字符串部分中,希望会工作。我至少走在正确的轨道上了吗?
我应该提到我正在使用SQLite进行开发,使用PostgreSQL进行生产。
感谢您的智慧!
答案 0 :(得分:2)
问题在于,如果从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
转换为天数,然后再减去。
答案 1 :(得分:1)
我不太了解SQL直接回答你的问题(我认为这可能还取决于你正在使用的数据库,所以你可能想提一下)。
您是否考虑过将start_date
和end_date
作为DateTime列而不是start_date
和duration_in_mins
?如果这将是一个常见的查询,那肯定会使它更高效,并使您的代码更易于阅读和理解。
答案 2 :(得分:1)
此查询仅在您的数据库足够智能以了解如何添加(我假设的)是DateTime和整数时才有效。而且我想不出一个能够正确编码的数据库。没有数据库会假设分钟。有些人可能做蜱,秒或天。
这部分计算
(? - duration_in_mins)
将在数据库上发生,而不是在Ruby-land中发生。