Rails 3:是否可以在查询中访问模型的属性?

时间:2011-04-28 00:48:44

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

很抱歉,如果这个问题听起来很奇怪,但我正在深入研究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进行生产。

感谢您的智慧!

3 个答案:

答案 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_dateend_date作为DateTime列而不是start_dateduration_in_mins?如果这将是一个常见的查询,那肯定会使它更高效,并使您的代码更易于阅读和理解。

答案 2 :(得分:1)

此查询仅在您的数据库足够智能以了解如何添加(我假设的)是DateTime和整数时才有效。而且我想不出一个能够正确编码的数据库。没有数据库会假设分钟。有些人可能做蜱,秒或天。

这部分计算

(? - duration_in_mins)

将在数据库上发生,而不是在Ruby-land中发生。