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

时间:2011-10-22 08:07:06

标签: ruby-on-rails activerecord

我有一些表:

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

如您所见, - 用户当时没有离线(假设现在是14:15)。我需要获得所有用户在线的持续时间。如果用户当前没有离线 - 我需要区别Time.now - online。

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

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

没关系,但是如果我有很多记录就会这么慢......我怎么能通过数据库来做呢?

2 个答案:

答案 0 :(得分:3)

我认为这不会有任何区别。即使有数百条记录,你还有一个额外的测试,每条记录只有零,而且只有一次'Time.now'计算。与模型对象的生成相比,几乎没有任何东西。您可以计算存储的差异,然后让数据库计算总和。但是我只会在必要的情况下这样做(如果没有破坏,不要调整性能)。

修改的 如果您必须多次计算在线时间的总和,则应在存储离线时间戳时预先计算在线时间:

  1. 通过迁移添加属性diff作为integer,以分钟为单位。
  2. 存储离线时间戳时,请计算差异并将其存储在一起。
  3. 通过致电:Model.sum("diff")
  4. 添加总和
  5. 在@davidb的解决方案中写下了唯一的记录(在你的例子中可能只有一个)。

答案 1 :(得分:1)

我认为在那个位置,做两个查询将是easyes解决方案。一个排除数据集,其中offline是NULL,另一个是只抓取这些数据集。那么你可以使用像这样的CURRENT_TIMESTAMP变量(它总是包含实际时间的时间映射):

Model.where("offline IS NULL").sum("CURRENT_TIMESTAMP-online")

然后你可以添加first和secound查询的结果。也许使用方法功能:

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

有可能在一个查询中执行此操作,但我认为这是可行的!