我正在构建一个应用程序,用于检查用户何时需要更换其中一辆汽车的油。以下是它的工作原理:
现在,当用户回到该网站时,他希望看到他所有需要换油的汽车列表。然后他更换油并更新'oil_changed_at'属性。
我正在使用Car-model的以下列:
title:string
oil_changed_at:datetime
oil_expiration_timeframe:integer
我的问题:存储这个'oil_expiration_timeframe'的首选方法是什么?当我想获得所有需要换油的汽车清单时,我的情况应该是什么样子? ?
请记住,oil_expiration_timeframe可能会在几天到几年之间变化。它永远不会少于一天,所以我想我可以存储该领域的天数。但是,我不确定如何在查询中组合整数和日期时间。
答案 0 :(得分:1)
这实际上是了解一堆SQL日期函数的问题。在MySQL中,它看起来像这样:
:conditions =>
"DATE_ADD(DATE(oil_changed_at),
INTERVAL oil_expiration_timeframe DAY) <= CURDATE()"
唯一的缺点是没有一种优化此查询的好方法。如果性能成为问题,则最简单的方法是将当前的到期日期另外存储在数据库中。
答案 1 :(得分:1)
如果您对oil_changed_at列编制索引,则以下方法是有效的。
Car.all(:conditions => [
"oil_changed_at > DATE_SUB(?, INTERVAL oil_expiration_timeframe day)", Time.now
])
更好的方法是将新列(next_oil_change_date)添加到Car模型以存储下一个换油日期,并在更改Car模型时更新col。
class Car < ActiveRecord::Base
before_save :set_next_oil_change_date
def set_next_oil_change_date
self.next_oil_change_date = next_oil_change_date +
oil_expiration_timeframe.days
end
end
现在您可以将查询编写为:
Car.all(:conditions => [
"next_oil_change_date > ? ", Time.now
])
不要忘记将next_oil_change_date
列编入索引。
答案 2 :(得分:0)
向DateTime添加一个数字会将该日期添加到日期。例如:
irb(main):005:0> DateTime.now.to_s
=> "2010-08-27T18:32:36-06:00"
irb(main):006:0> (DateTime.now + 7).to_s
=> "2010-09-03T18:32:48-06:00"
所以我建议坚持原来的计划,将偏移量保存几天。
答案 3 :(得分:0)
根据wuputah的MySQL查询代码,我为SQLite提出了以下内容:
:conditions => 'date(oil_changed_at, oil_expiration_timeframe||" days") <= date("now")'
当然,数据库无关的方法仍然是首选。