byroot/activerecord-typedstore

View on GitHub
lib/active_record/typed_store/type.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

module ActiveRecord::TypedStore
  class Type < ActiveRecord::Type::Serialized
    def initialize(typed_hash_klass, coder, subtype)
      @typed_hash_klass = typed_hash_klass
      super(subtype, coder)
    end

    [:deserialize, :type_cast_from_database, :type_cast_from_user].each do |method|
      define_method(method) do |value|
        if value.nil?
          hash = {}
        else
          hash = super(value)
        end

        @typed_hash_klass.new(hash)
      end
    end

    [:serialize, :type_cast_for_database].each do |method|
      define_method(method) do |value|
        return if value.nil?

        if value.respond_to?(:to_hash)
          super(value.to_hash)
        else
          raise ArgumentError, "ActiveRecord::TypedStore expects a hash as a column value, #{value.class} received"
        end
      end
    end

    def defaults
      @typed_hash_klass.defaults_hash
    end

    def default_value?(value)
      value == defaults
    end

    def changed_in_place?(raw_old_value, value)
      return false if value.nil?
      raw_new_value = serialize(value)
      raw_old_value.nil? != raw_new_value.nil? || raw_old_value != raw_new_value
    end
  end
end