2011-10-22 55 views
0

我有一些表:Rails ActiveRecord如何将Time.now设置为NULL?

online | offline 
10:32 | 11:06 
12:28 | 13:04 
14:07 | NULL 

正如你所看到的, - 用户没有在脱机时(假设现在是14:15)。我需要获得所有用户在线时间。如果用户目前不在线下 - 我需要获得差异Time.now - 在线。

在我的Ruby代码创建功能:

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

这是确定的,但如果我有很多的记录它会这么慢?我怎样才能做到这一点通过数据库?

回答

3

我不认为这会有什么区别。即使拥有数百条记录,您还有另外一项测试是针对每条记录的零次测试,并且只计算一次'Time.now'。与模型对象的生成相比,几乎没有什么。您可以计算存储上的差异,然后让数据库计算总和。但是我只会在必要时做到这一点(如果它没有损坏,不要调整性能)。

编辑 如果计算在线时间很多次的总和,你应该存储离线时间戳记计算在线时间前期:

  1. 添加由迁移属性diffinteger以分钟为单位的差异。
  2. 存储脱机时间戳时,计算差异并将其存储在一起。
  3. 通过调用添加的款项:Model.sum("diff")
  4. 加入,唯一的记录(有可能是只有在你的例子之一)作为@davidb写在他的解决方案。
+1

在数据库可以更快和/或更好地完成数据库操作时,Dude对ruby中的事物并不好。当我们谈论数百甚至数千数据集的时候,因为你的权利并不重要,但是当你达到更高层次时,你可能会遇到一些问题,所以最好从第一天开始,而不是现在的应用程序就像一个fusee一样慢。 – davidb

+0

我不同意你的看法。要在Ruby中有足够快的解决方案,开发和维护起来要容易得多。举个例子,我没有看到你有数百万条记录(从离线切换到在线),所以不,如果没有必要,不要优化。吻! – mliebelt

+0

是的,因为这很容易,但我不认为在红宝石包括两个SQL命令的解决方案是可怕的维护。它仍然是ActiveRecord,没有令人毛骨悚然的纯SQL。 – davidb

1

我认为在这个位置,这将是easyes解决方案做两个查询。一个排除了离线空值的数据集和一个只抓取这些数据集的数据集。然后你可以使用CURRENT_TIMESTAMP变量(它总是包含了实际时间timestmap)的MySQL这样的:

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 

可能可以做到这一点在一个查询,但我认为这是退出practable!

+0

谢谢!我马上试试这个。 – ValeriiVasin

+0

似乎一切正常,但离线的差异 - 在线目前不在秒内:(任何suggessions? – ValeriiVasin

+0

添加了一些更改忘记.to_i – davidb