Как мне сделать автоматическое преобразование времени Rails во время эпохи Unix?

У меня есть приложение Rails, в котором интенсивно используются поля created_at и updated_at.

Я обнаружил, что что-то вроде Post.last.created_at.to_f даст мне время эпохи, но мне всегда нужно время эпохи, поэтому мне было интересно, есть ли способ написать автоматический фильтр после запроса, который будет выполнять преобразование каждый раз, когда я вызываю created_at и update_at. Прямо сейчас, каждый раз, когда я читаю created_at/updated_at, я повторяюсь, что является дурным тоном и уже вызывает ошибки, когда я забываю сделать преобразование.

Я использую Rails 3.2.13 и Ruby 1.9.3p392.

Кроме того, я не могу просто написать post.created_at.to_f в моем представлении, так как я использую JSON для вывода.


person user1816847    schedule 12.07.2013    source источник
comment
Возможно, вам следует рассмотреть возможность использования спецификации даты ISO 8601, которая становится де-факто форматом даты JSON, указанным в ECMAScript 5.   -  person Niels B.    schedule 13.07.2013


Ответы (2)


Лично я считаю, что подход, предложенный @tadman, лучше.

created_at может быть следующим, чтобы делать то, что вы хотите:

      def created_at
        created_at= attributes["created_at"]
        created_at ? created_at.to_f : nil
      end

Поместите его в модели или прикрепите к ActiveRecord::Base. Тщательно протестируйте его перед запуском в производство.

person Deepak Kumar    schedule 14.07.2013
comment
Заставить created_at возвращать число с плавающей запятой, вероятно, очень плохая идея. Вы не можете выполнять с ним какие-либо вычисления даты, что делает его практически бесполезным для многих операций, если только вы не потратите средства на повторное преобразование его обратно в дату. - person tadman; 15.07.2013
comment
ОП здесь. Единственное, что нужно видеть created_at, это другие машины. Со временем эпохи намного проще работать при обмене временем, поэтому я не собираюсь указывать интерфейс, который использует что-либо еще. Также в рельсах переход от эпохи назад к объекту времени ЛЕГКО. - person user1816847; 16.07.2013

Почему бы вам просто не сделать метод, который вы можете вставить в ActiveRecord::Base?

def created_epoch
  self.created_at.to_f
end

Тогда вам не нужно будет помнить о конвертации, вы можете просто использовать этот метод.

person tadman    schedule 12.07.2013
comment
Это не позволит мне использовать рендеринг :json =› @post - person user1816847; 13.07.2013
comment
Вы всегда можете переопределить метод serializable_hash в вашей модели, чтобы включить настраиваемые поля, которые вы определили. - person tadman; 15.07.2013