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”)
我认为这不会有什么不同。即使有数百条记录,您还需要对每条记录进行一次nil额外测试,并且只需计算一次“Time.now”。与模型对象的生成相比,这几乎是零。您可以计算存储的差异,然后让数据库计算总和。但我只会在必要时这样做(如果没有损坏,就不要调整性能) 编辑 如果必须计算多次联机时间的总和,则在存储脱机时间戳时应提前计算联机时间:
diff
添加为integer
以分钟为单位的差值Model.sum(“diff”)
我认为在这种情况下,做两个查询将是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命令的解决方案是可行的