Sha256: 13e171f752463e4f966bd649721002290bc690cb2e16e22eb58969a19b09207d

Contents?: true

Size: 1.97 KB

Versions: 6

Compression:

Stored size: 1.97 KB

Contents

# frozen_string_literal: true

require_relative '../reference'

# Reference attribute type for has_one
module LedgerSync
  class ResourceAttribute
    class Reference
      class Many < Reference
        class ManyArray
          include ActiveModel::Dirty

          ARRAY_METHODS_TO_OVERRIDE_WITH_DIRTY = %w[<< | []= + -].freeze

          delegate  :count,
                    :each,
                    :include?,
                    :map,
                    to: :value

          attr_accessor :value

          define_attribute_methods :value

          def initialize
            @value = []
          end

          ARRAY_METHODS_TO_OVERRIDE_WITH_DIRTY.each do |array_method|
            define_method(array_method) do |val|
              value_will_change!
              @value = @value.send(array_method, val)
            end
          end

          def ==(other)
            return false unless other.is_a?(ManyArray)
            return false unless other.sorted_fingerprints == sorted_fingerprints

            true
          end

          def save
            changes_applied
          end

          def sorted_fingerprints
            value.map(&:fingerprint).sort
          end
        end

        module Mixin
          def self.included(base)
            base.extend(ClassMethods)
          end

          module ClassMethods
            def references_many(name, to:)
              resource_attribute = ResourceAttribute::Reference::Many.new(name: name, to: to)
              resource_attributes.add resource_attribute
              _define_attribute_methods(name)
            end
          end
        end

        def initialize(name:, to:)
          super(
            name: name,
            type: Type::ReferenceMany.new(resource_class: to),
            value: ManyArray.new
          )
        end

        def changed?
          value.changed?
        end

        def changes
          value.changes
        end

        def save
          value.save
        end
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
ledger_sync-1.3.4 lib/ledger_sync/resource_attribute/reference/many.rb
ledger_sync-1.3.3 lib/ledger_sync/resource_attribute/reference/many.rb
ledger_sync-1.3.2 lib/ledger_sync/resource_attribute/reference/many.rb
ledger_sync-1.3.1 lib/ledger_sync/resource_attribute/reference/many.rb
ledger_sync-1.1.3 lib/ledger_sync/resource_attribute/reference/many.rb
ledger_sync-1.1.2 lib/ledger_sync/resource_attribute/reference/many.rb