2017-02-03 13 views
0

я м очень новый для Ruby, хотят понять наилучшую практику в сравнении времениЛучшая практика, в рубине (не рельсы) время Comparision

У меня есть expireAt метки времени от объекта, где нужно применить определенную логику и сравнить с текущим временем. Имея это в виду.

Что лучше подход,

if Time.now.to_i < obj.expireAt 
    // some logic 
end 

или

if Time.now < Time.at(obj.expireAt) 
    // some logic 
end 

Заранее спасибо!

+1

Каков класс 'obj.expireAt'? Основываясь на вашем коде, он кажется простым целым числом. Лучшей практикой в ​​Ruby было бы сделать этот атрибут объекта экземпляром 'Time' или' DateTime' в первую очередь и сделать преобразование только один раз, где бы это значение не было установлено. Тогда в точке вашего кода вы просто делаете 'Time.now

+0

'obj.expireAt' - простое целое число (временная метка). Можете ли вы объяснить мне, почему его лучше сравнивать с Time или DateTime.Просто любопытно узнать. –

+1

Потому что это самодокументировано и самодостаточно. Вы можете проверить объект и определить его класс; если его 'Fixnum', это не говорит вам ничего полезного. Вы должны как-то знать, что это временная метка и как преобразовать ее в фактическое значение времени. Если это «Время», вы не только знаете, что это такое, но все методы этого класса доступны для управления им. Все в Ruby - это экземпляр некоторого класса; вы также можете использовать ту, которая соответствует вашей ценности. –

ответ

0

Если у вас есть значение в базе данных, которая интерпретируется как значение DateTime по Rails, то сделать это:

if Time.now < obj.expire_at 
    # ... 
end 

Там нет необходимости конвертировать с at или to_i. Во многих случаях это бессмысленно и расточительно.

Использование колонтитула TIMESTAMP столбец часто является субоптимальным, это слабый тип данных в MySQL, который удобен тем, что он автозаполнен, но он также ограничен, значения не могут превышать 2038 год, настроившись на неизбежный проблема типа Y2K.

Также обратите внимание, что Ruby on Rails сильно поддерживает имена и имена всех строчных букв. expireAt сильно нерегулярно.

+0

Пожалуйста, прочтите мой вопрос. Я ищу ответ в чистом рубине. Нет рамки Rails. –

+1

Обратите внимание, что вы отметили свой вопрос Rails, который обычно является сильным индикатором вашего ответа. Те же рекомендации применяются. – tadman

+0

Спасибо за эту информацию. Удалено мой тег. Мы не можем сравнивать временную метку с объектом Time. –

1

На основе вашего кода obj.expireAt представляется простым целым числом. Обычной лучшей практикой в ​​Ruby было бы сделать этот атрибут объекта экземпляром Time или DateTime. (См. this question для обсуждения различий между этими двумя параметрами.) Если ваши данные поступают как целые числа, сделайте преобразование один раз, когда вы храните значение в переменной экземпляра, а не повторно, когда обращаетесь к нему для других целей. Вы всегда можете кэшировать целое число и сделать его доступным также с помощью другого метода, если вам нужно вернуть его, не выполняя преобразование назад.

Это считается лучшей практикой, потому что он делает атрибут самодокументированным и автономным. Вы можете проверить объект и определить, что его класс (хотя это делает программным способом считается плохой формой в Ruby, где мы обычно предпочитаем Duck Typing). Если я посмотрю на значение, которое я вернусь от expireAt и вижу, что это Fixnum, это не говорит мне ничего полезного. Я должен сделать вывод, что это временная метка, и делать дополнительную работу, чтобы преобразовать ее в значение с полезной временной семантикой. Если это Time, я не только знаю, что это такое, но у меня есть все методы этого класса, доступные для его манипулирования.

Поскольку все в Ruby является объектом (и, следовательно, экземпляром какого-либо класса), вы также можете использовать класс, предназначенный для использования так, как используется ваше значение.

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

  • Нет связанных вопросов^_^