Sha256: 3e49edc0b5775980de8c775b519c1887b8ab9142d9e6ab6690ac2ebef3d7307f

Contents?: true

Size: 1002 Bytes

Versions: 3

Compression:

Stored size: 1002 Bytes

Contents

# typed: false
# frozen_string_literal: true

module ActiveRecord
  module EjectionSeat
    # Defines `#eject` `.buckle` methods for going between ActiveRecord models and Sorbet T::Structs.
    module Ejectable
      def ejects_to(klass)
        define_eject_method(klass)
        define_buckle_method(klass)
      end

      private

      def define_eject_method(klass)
        define_method(:eject) do
          klass.new(
            PropsBuilder.new(
              model: self,
              target_struct: klass
            ).build
          )
        end

        alias_method :to_struct, :eject
      end

      def define_buckle_method(klass)
        define_singleton_method(:buckle) do |struct|
          raise ArgumentError if struct.class != klass

          new(AttributesBuilder.new(struct: struct, target_model: self).build)
        end

        singleton_class.send :alias_method, :from_struct, :buckle
      end
    end
  end

  class Base
    extend EjectionSeat::Ejectable
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
activerecord-ejection_seat-0.3.2 lib/activerecord-ejection_seat/ejectable.rb
activerecord-ejection_seat-0.3.1 lib/activerecord-ejection_seat/ejectable.rb
activerecord-ejection_seat-0.3.0 lib/activerecord-ejection_seat/ejectable.rb