Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.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 Rails ActiveRecord如何将NULL设置为Time.now?_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails Rails ActiveRecord如何将NULL设置为Time.now?

Ruby on rails Rails ActiveRecord如何将NULL设置为Time.now?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一些桌子: online | offline 10:32 | 11:06 12:28 | 13:04 14:07 | NULL 如您所见,-用户当时没有脱机(假设现在是14:15)。我需要获得所有用户联机的持续时间。如果用户当前未脱机-我需要获得差分时间。现在-联机 在我的ruby代码中,我创建了以下函数: def offline_datetime if offline.nil? then Time.current else offline end end 没关系,但如果我有很

我有一些桌子:

online | offline
 10:32 | 11:06
 12:28 | 13:04
 14:07 | NULL
如您所见,-用户当时没有脱机(假设现在是14:15)。我需要获得所有用户联机的持续时间。如果用户当前未脱机-我需要获得差分时间。现在-联机

在我的ruby代码中,我创建了以下函数:

def offline_datetime
  if offline.nil? then Time.current else offline end
end

没关系,但如果我有很多记录,它会很慢。。。我怎样才能通过数据库做到这一点?

我认为这不会有任何区别。即使有数百条记录,您还需要对每条记录进行一次nil额外测试,并且只需计算一次“Time.now”。与模型对象的生成相比,这几乎是零。您可以计算存储的差异,然后让数据库计算总和。但我只会在必要时这样做(如果没有损坏,就不要调整性能)

编辑 如果必须计算多次联机时间的总和,则在存储脱机时间戳时应提前计算联机时间:

  • 通过迁移将属性
    diff
    添加为
    integer
    以分钟为单位的差值
  • 在存储脱机时间戳时,计算差异并将其存储在一起
  • 通过调用:
    Model.sum(“diff”)
  • 再加上@davidb在其解决方案中所写的唯一记录(在您的示例中可能只有一条)

  • 我认为这不会有什么不同。即使有数百条记录,您还需要对每条记录进行一次nil额外测试,并且只需计算一次“Time.now”。与模型对象的生成相比,这几乎是零。您可以计算存储的差异,然后让数据库计算总和。但我只会在必要时这样做(如果没有损坏,就不要调整性能)

    编辑 如果必须计算多次联机时间的总和,则在存储脱机时间戳时应提前计算联机时间:

  • 通过迁移将属性
    diff
    添加为
    integer
    以分钟为单位的差值
  • 在存储脱机时间戳时,计算差异并将其存储在一起
  • 通过调用:
    Model.sum(“diff”)
  • 再加上@davidb在其解决方案中所写的唯一记录(在您的示例中可能只有一条)

  • 我认为在这种情况下,做两个查询将是easyes的解决方案。一个排除脱机为空的数据集,另一个仅捕获这些数据集。然后您可以使用MySQL的CURRENT_TIMESTAMP变量(它总是包含实际时间的timestmap),如下所示:

    Model.where("offline IS NULL").sum("CURRENT_TIMESTAMP-online")
    
    然后可以添加第一个和第二个查询的结果。可能使方法从中发挥作用:

    def self.your_method_name_here
         secounds=0
         secounds+=Model.where("offline IS NOT NULL").sum("offline-online").to_i
         secounds+=Model.where("ofline IS NULL").sum("CURRENT_TIMESTAMP-online").to_i
         secounds
    end
    

    可能在一个查询中就可以做到这一点,但我认为这是可行的

    我认为在这种情况下,进行两次查询将是easyes的解决方案。一个排除脱机为空的数据集,另一个仅捕获这些数据集。然后您可以使用MySQL的CURRENT_TIMESTAMP变量(它总是包含实际时间的timestmap),如下所示:

    Model.where("offline IS NULL").sum("CURRENT_TIMESTAMP-online")
    
    然后可以添加第一个和第二个查询的结果。可能使方法从中发挥作用:

    def self.your_method_name_here
         secounds=0
         secounds+=Model.where("offline IS NOT NULL").sum("offline-online").to_i
         secounds+=Model.where("ofline IS NULL").sum("CURRENT_TIMESTAMP-online").to_i
         secounds
    end
    

    可能在一个查询中就可以做到这一点,但我认为这是可行的

    谢谢!我会立即尝试这个。看起来一切正常,但离线-在线的差异目前不在几秒钟内:(有任何建议吗?添加了一些更改。忘记。to_ino:)我的意思是DB返回了不正确的结果,例如15分钟内返回1500。我一年多前就有这个问题了,但我不记得了。。。我在DB查询中做了一些转换以获得正确答案。。。我会查的。你有这样的问题吗?1500?它应该能返回900秒。谢谢!我会立即尝试这个。看起来一切正常,但离线-在线的差异目前不在几秒钟内:(有任何建议吗?添加了一些更改。忘记。to_ino:)我的意思是DB返回了不正确的结果,例如15分钟内返回1500。我一年多前就有这个问题了,但我不记得了。。。我在DB查询中做了一些转换以获得正确答案。。。我会查的。你有这样的问题吗?1500?它应该返回900秒。当数据库可以更快和/或更好地完成任务时,用ruby做事情是不好的。当然,你的权利当我们谈论数百甚至数千个数据集时,这并不重要,但当你达到更高的水平时,你可能会遇到一些问题,因此最好从第一天开始就以正确的方式来做,而不是现在应用程序像fusee一样慢。我不同意你的观点。用Ruby开发一个足够快的解决方案更容易开发和维护。举个例子,我看不出你有数百万条记录(从离线切换到在线),所以不,如果没有必要,不要优化。吻是的,因为这很容易,但我认为ruby中包含两条SQL命令的解决方案维护起来并不可怕。它仍然是ActiveRecord,并且没有令人毛骨悚然的纯SQL。例如,如果我有700条记录用于计算,那么差异是5倍。代码行之间的差异是2对5。我认为使用数据库进行计算是很有说服力的。当数据库可以更快更好地运行时,使用ruby是不好的。当然,你的权利当我们谈论数百甚至数千个数据集时,这并不重要,但当你达到更高的水平时,你可能会遇到一些问题,因此最好从第一天开始就以正确的方式来做,而不是现在应用程序像fusee一样慢。我不同意你的观点。用Ruby开发一个足够快的解决方案更容易开发和维护。举个例子,我看不出你有数百万条记录(从离线切换到在线),所以不,如果没有必要,不要优化。吻是的,因为这很容易,但我不认为ruby中包含两条SQL命令的解决方案是可行的