2015-09-14 2 views
0

У меня есть столбец, который должен содержать разницу между created_at и updated_at в минутах, поэтому я попытался сделать следующее, но обычно сохраняет значение time_diff с нулем. Итак, как я могу это исправить?Вычисление разницы между created_at и now() в rails update

Product.update(
    id, 
    time_diff: "((EXTRACT (DAY FROM (now()-created_at))*24*60*60+ 
        EXTRACT (HOUR FROM (now()-created_at))*60*60+ 
        EXTRACT (MINUTE FROM (now()-created_at))*60+ 
        EXTRACT (SECOND FROM (now()-created_at)))/60)::int" 
) 

Запрос на извлечение отлично работает в SQL, но он не работает в обновлении activerecord.

ответ

2

extract (epoch ...) дает интервал в секундах, поэтому использование:

select extract (
    epoch from now() - '2015-09-14 03:06:02.848+02'::timestamp)::int/60 
    as minutes; 

minutes 
--------- 
     7 
(1 row) 
+0

На самом деле, экстракт отлично работает SQL-Side, но проблема в том, с обновлением Rails activerecord –

+0

Возможно, это сообщение могло бы помочь: [Как выполнить необработанное обновление sql с динамической привязкой в ​​рельсах] (http://stackoverflow.com/questions/4483049/how-to-execute-a-raw-update- sql-with-dynamic-binding-in-rails) – klin

2

много способов для разницы во времени. Вы можете сделать пользовательский метод разницы во время, как:

def time_diff(start_time, end_time) 
    seconds_diff = (start_time - end_time).to_i.abs 

    hours = seconds_diff/3600 
    seconds_diff -= hours * 3600 

    minutes = seconds_diff/60 
    seconds_diff -= minutes * 60 

    seconds = seconds_diff 

    "#{hours.to_s.rjust(2, '0')}:#{minutes.to_s.rjust(2, '0')}:#{seconds.to_s.rjust(2, '0')}" 
end 

и использовать его

time_diff(updated_at, created_at) #just example 

Или вы можете использовать рубиновый камень time_difference

+0

Я хочу сделать он за один шаг при использовании activerecord .update ... не хочет получать данные и вычислять разницу, а затем сохранять дату –

+0

@ MahmoudM.Abdel-Fattah написать обратный вызов after_save: update_time_diff # product.rb def update_time_diff update_attributes (time_diff: (update_at - created_at)/60) end надеюсь, что это сработает для вас. – Suneel

Смежные вопросы