Sha256: cc88fddc0bc29047d6c65cfe3fe5bb02b5383c9aaef75493ac6e546086964e6c

Contents?: true

Size: 1.43 KB

Versions: 2

Compression:

Stored size: 1.43 KB

Contents

require 'active_record'

module BarkestCore
  module UtcConversion
    class UtcConverter < DelegateClass(ActiveRecord::Type::Value)
      include ActiveRecord::Type::Decorator

      def type_cast_from_database(value)
        convert_to_utc(value)
      end

      def type_cast_from_user(value)
        convert_to_utc(value)
      end

      def convert_to_utc(value)
        if value.is_a?(Array)
          value.map { |v| convert_to_utc(v) }
        else
          Time.utc_parse(value) rescue nil
        end
      end

    end

    extend ActiveSupport::Concern

    included do
      self.time_zone_aware_attributes = false if self.respond_to?(:time_zone_aware_attributes=)
    end

    module ClassMethods
      private

      def inherited(subclass)
        subclass.class_eval do
          matcher = ->(name, type) { create_utc_conversion_attribute?(name, type) }
          decorate_matching_attribute_types(matcher, :_utc_conversion) do |type|
            UtcConverter.new(type)
          end
        end
        super
      end

      # disable TimeZoneConversion
      def create_time_zone_conversion_attribute?(name, cast_type)
        false
      end

      # enable UtcConversion
      def create_utc_conversion_attribute?(name, cast_type)
        cast_type.type == :datetime
      end
    end

  end
end

# add it to the base model.
ActiveRecord::Base.include BarkestCore::UtcConversion

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
barkest_core-1.5.4.0 lib/barkest_core/concerns/utc_conversion.rb
barkest_core-1.5.3.0 lib/barkest_core/concerns/utc_conversion.rb