Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使用:将(日期时间)与(日期时间+;';天数';)进行比较的条件?_Ruby On Rails_Ruby_Datetime_Activerecord_Ruby On Rails 3 - Fatal编程技术网

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

我正在开发一个应用程序,它可以检查用户何时需要更换其中一辆车的机油。下面是它的工作原理:

  • 用户输入其汽车的名称(例如“福特野马”)
  • 用户输入一次换油后汽车运行的时间(例如3个月)
  • 用户将汽车保存到数据库中
  • 对所有其他车辆重复上述过程。(是的,它是一个富有的用户;)
  • 现在,当用户返回该站点时,他希望看到所有需要换油的汽车的列表。然后他更换机油并更新“oil_changed_at”属性

    我将以下列用于汽车模型:

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