Sha256: b65b1df2a9466cdfc2ae0972f7fbbbdac74dd485929f45e1ad02d5d83b3aa72d

Contents?: true

Size: 1.48 KB

Versions: 11

Compression:

Stored size: 1.48 KB

Contents

module Spyke
  module Associations
    class HasMany < Association
      def initialize(*args)
        super
        @options.reverse_merge!(uri: "/#{parent.class.model_name.plural}/:#{foreign_key}/#{klass.model_name.plural}/(:id)")
        @params[foreign_key] = parent.id
      end

      def load
        self
      end

      def assign_nested_attributes(incoming)
        incoming = incoming.values if incoming.is_a?(Hash)
        combined_attributes = combine_with_existing(incoming)
        clear_existing!
        combined_attributes.each do |attributes|
          build(attributes)
        end
      end

      private

        def combine_with_existing(incoming)
          return incoming unless primary_keys_present_in_existing?
          combined = embedded_params + incoming
          group_by_primary_key(combined).flat_map do |primary_key, hashes|
            if primary_key.present?
              hashes.reduce(:merge)
            else
              hashes
            end
          end
        end

        def group_by_primary_key(array)
          array.group_by { |h| h.with_indifferent_access[:id].to_s }
        end

        def primary_keys_present_in_existing?
          embedded_params && embedded_params.any? { |attr| attr.has_key?('id') }
        end

        def clear_existing!
          update_parent []
        end

        def add_to_parent(record)
          parent.attributes[name] ||= []
          parent.attributes[name] << record
          record
        end
    end
  end
end

Version data entries

11 entries across 11 versions & 1 rubygems

Version Path
spyke-1.8.7 lib/spyke/associations/has_many.rb
spyke-1.8.6 lib/spyke/associations/has_many.rb
spyke-1.8.5 lib/spyke/associations/has_many.rb
spyke-1.8.4 lib/spyke/associations/has_many.rb
spyke-1.8.3 lib/spyke/associations/has_many.rb
spyke-1.8.2 lib/spyke/associations/has_many.rb
spyke-1.8.1 lib/spyke/associations/has_many.rb
spyke-1.8.0 lib/spyke/associations/has_many.rb
spyke-1.7.2 lib/spyke/associations/has_many.rb
spyke-1.7.1 lib/spyke/associations/has_many.rb
spyke-1.7.0 lib/spyke/associations/has_many.rb