0

阶段

我有这个模型:

Promo(id: integer, start_date: datetime, end_date: datetime)

我想知道目前有哪些促销活动。可能我们的查询应该是这样的:

SELECT * FROM promos WHERE now BETWEEN start_date AND end_date;

问题

我应该如何在 Ruby 中制作它?哪个是正确的方法?

谢谢你。

4

3 回答 3

2

Rails 是智能的。如果您检索日期/时间,它将转换为 DateTime 对象。相反,将 DateTime 对象传递给 where 子句(对于 Rails 3.x),它将正确构建 where 子句。

传递给 where 子句的字符串将被传递给 SQL where 子句。如果你传递一个数组,第二个和后面的元素将被替换为“?” 第一个元素中的字符。

因此,对于您的情况:

Promo.where(["? between start_date and end_date", DateTime.now])

作品。我在我的 Rails 模型(位置)上验证了它恰好有 start_date 和 end_date,并且工作正常:

[1] pry(main)> Position.where(["? between start_date and end_date", DateTime.now]).count
=> 2914

它在带有 PostgreSQL 的 Rails 3.2.8 上。

于 2012-10-26T05:48:40.060 回答
0

尚未对此进行测试,但请尝试以下操作:

currentTime = Time.now()
Promo.find(
     :all,
     :conditions => ['start_date < ? AND end_date > ?', currentTime, currentTime]
)

Date如果Time课程不起作用,您可能需要使用该课程

于 2012-10-26T04:56:23.857 回答
0

是的,您可以使用比较运算符来比较日期,例如:

irb(main):018:0> yesterday = Date.new(2009,6,13)
=> #<Date: 4909991/2,0,2299161>
irb(main):019:0> Date.today > yesterday
=> true

但是您是否尝试将日期与日期时间进行比较?

如果是这种情况,您需要将日期时间转换为日期,然后进行比较。

或者

Date.parse('2010-11-01') < Date.today

如果 '2010-11-01' 已经过去,将返回 true

我希望这有帮助。

于 2012-10-26T04:43:45.830 回答