Ruby on rails 如何使用:将(日期时间)与(日期时间+;';天数';)进行比较的条件?
我正在开发一个应用程序,它可以检查用户何时需要更换其中一辆车的机油。下面是它的工作原理:Ruby on rails 如何使用:将(日期时间)与(日期时间+;';天数';)进行比较的条件?,ruby-on-rails,ruby,datetime,activerecord,ruby-on-rails-3,Ruby On Rails,Ruby,Datetime,Activerecord,Ruby On Rails 3,我正在开发一个应用程序,它可以检查用户何时需要更换其中一辆车的机油。下面是它的工作原理: 用户输入其汽车的名称(例如“福特野马”) 用户输入一次换油后汽车运行的时间(例如3个月) 用户将汽车保存到数据库中 对所有其他车辆重复上述过程。(是的,它是一个富有的用户;) 现在,当用户返回该站点时,他希望看到所有需要换油的汽车的列表。然后他更换机油并更新“oil_changed_at”属性 我将以下列用于汽车模型: title:string oil_changed_at:datetime oil_exp
title:string
oil_changed_at:datetime
oil_expiration_timeframe:integer
我的问题:存储此“机油到期时间”的首选方式是什么?当我想要获得所有需要换油的车辆的列表时,我的条件应该是什么
请记住,石油到期时间可能从几天到几年不等。它永远不会少于一天,所以我想我可以在该字段中存储天数。但是,我不知道如何在查询中组合整数和日期时间。在日期时间中添加一个数字会增加日期的天数。例如:
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"
因此,我建议您坚持原来的计划,将偏移量存储为若干天。这实际上是一个了解大量SQL日期函数的问题。在MySQL中,它将如下所示:
:conditions =>
"DATE_ADD(DATE(oil_changed_at),
INTERVAL oil_expiration_timeframe DAY) <= CURDATE()"
:条件=>
“添加日期(换油日期),
间隔油(过期时间段日)如果您在列中索引您的换油,以下方法是有效的
Car.all(:conditions => [
"oil_changed_at > DATE_SUB(?, INTERVAL oil_expiration_timeframe day)", Time.now
])
更好的方法是在汽车模型中添加一个新列(next_oil_change_date),以存储下一个换油日期,并在汽车模型发生更改时更新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
别忘了为下一个油更改日期列编制索引。基于wuputah的MySQL查询代码,我为SQLite提供了以下内容:
:conditions => 'date(oil_changed_at, oil_expiration_timeframe||" days") <= date("now")'
:conditions=>“date(oil_changed_at,oil_expiration_timeframe | | | days”)是的,我知道这一点。但我如何在查询中使用它?我需要使用DateTime.now(一个Ruby函数)和oil_expiration_timeframe(表中的一列)进行计算。我不知道如何在一个:conditions-statement中将两者结合起来。谢谢你的建议。我更喜欢数据库不可知论的方法,但这是一个很好的起点。我喜欢Kandada在查询上的方法(使用DATE_SUB),但我相信数据库不可知论经常被高估,除非这样做是明确的要求(一项艰巨的任务!)。我相信任何大型web应用程序都需要根据自己选择的RDBMS(和/或其他存储解决方案)优化其代码。不幸的是,ANSI SQL标准在数据库中的实现非常糟糕,但事实就是如此。谢谢你的回答。就像你和wuputah建议的那样,我将只创建下一个_oil_change_date列,这样我的代码就不会依赖于任何特定类型的数据库。谢谢你的建议。我更喜欢不依赖数据库的方法,但这是一个好的starting point。为了让我的生活更轻松,我可能会增加一个专栏。我会接受Kandaboggu的答案,因为它更广泛,可能会帮助其他人来到这个页面,但我真的很感谢你花时间回答。再次感谢!
:conditions => 'date(oil_changed_at, oil_expiration_timeframe||" days") <= date("now")'