阶段
我有这样的模型:
Promo(id: integer, start_date: datetime, end_date: datetime)
我想知道目前的促销活动是什么。可能是我们的查询应该是:
SELECT * FROM promos WHERE now BETWEEN start_date AND end_date;
问题
我该怎么用Ruby做呢?哪种方法是正确的?
谢谢。
发布于 2012-10-25 21:48:40
Rails是智能的。如果检索日期/时间,它将转换为DateTime对象。相反,将DateTime对象传递给where子句(对于Rails 3.x),它将正确构建where子句。
传递给where子句的字符串将传递给SQL子句。如果您传递一个数组,第二个和更高版本的元素将被替换为“?”第一个元素中的字符。
所以,对于你的案子:
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
它在Rails 3.2.8中使用PostgreSQL。
发布于 2012-10-25 20:43:45
是的,您可以使用比较运算符来比较日期,例如:
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-25 20:56:23
尚未对此进行测试,但请尝试如下:
currentTime = Time.now()
Promo.find(
:all,
:conditions => ['start_date < ? AND end_date > ?', currentTime, currentTime]
)
如果Date
类不能工作,则可能需要使用Time
类
https://stackoverflow.com/questions/13077439
复制