Rails ActiveRecord, как установить NULL как Time.now? - PullRequest
0 голосов
/ 22 октября 2011

У меня есть какая-то таблица:

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

Все нормально, но если у меня многозаписи это будет так медленно ... Как я могу сделать это через базу данных?

Ответы [ 2 ]

3 голосов
/ 22 октября 2011

Я не думаю, что это будет иметь значение.Даже с сотнями записей у вас дополнительно есть один дополнительный тест на ноль на запись и только одно вычисление «Time.now».По сравнению с генерацией модельных объектов это почти ничего.Вы можете вычислить разницу при хранении, а затем позволить базе данных вычислить сумму.Но я бы сделал это только в случае необходимости (не настраивайте производительность, если она не нарушена).

РЕДАКТИРОВАТЬ Если вам нужно много раз вычислять сумму времени в сети, вам следуетвычислить предварительное время при сохранении автономной отметки времени:

  1. Добавьте путем миграции атрибут diff как integer для разницы в минутах.
  2. При сохранении отметки времени в автономном режиме, вычислите также разницу и сохраните ее вместе.
  3. Добавьте суммы, вызвав: Model.sum("diff")
  4. Добавьте к этому единственную запись (в вашем примере может быть только одну) как @Давидб написал в своем решении.
1 голос
/ 22 октября 2011

Я думаю, что в таком положении было бы самым простым решением сделать два запроса. Один, за исключением наборов данных, где офлайн, равен NULL, и один, где только эти данные захватываются. Затем вы можете использовать переменную CURRENT_TIMESTAMP (она всегда содержит временную карту для фактического времени) 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

Возможно сделать это за один запрос, но я думаю, что это практически выполнимо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...