使用方法:比较条件(日期时间)和(日期时间+'天数')?

时间:2010-08-28 00:25:16

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

我正在构建一个应用程序,用于检查用户何时需要更换其中一辆汽车的油。以下是它的工作原理:

  1. 用户输入他的汽车名称(例如'Ford Mustang')
  2. 用户输入汽车在一次换油(例如3.个月)
  3. 上运行的时间
  4. 用户将汽车保存到数据库
  5. 对他所有的其他车重复上述过程。 (是的,它是一个富有的用户;)
  6. 现在,当用户回到该网站时,他希望看到他所有需要换油的汽车列表。然后他更换油并更新'oil_changed_at'属性。

    我正在使用Car-model的以下列:

    title:string
    oil_changed_at:datetime
    oil_expiration_timeframe:integer
    

    我的问题:存储这个'oil_expiration_timeframe'的首选方法是什么?当我想获得所有需要换油的汽车清单时,我的情况应该是什么样子? ?

    请记住,oil_expiration_timeframe可能会在几天到几年之间变化。它永远不会少于一天,所以我想我可以存储该领域的天数。但是,我不确定如何在查询中组合整数和日期时间。

4 个答案:

答案 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")'

当然,数据库无关的方法仍然是首选。