Sha256: 77d0905cf0ddbb1f599384b367e78f3203aec24788bf44e469c67d5b11ba8656

Contents?: true

Size: 1.58 KB

Versions: 7

Compression:

Stored size: 1.58 KB

Contents

module ROM
  class Repository
    class RelationProxy
      # Provides convenient methods for producing wrapped relations
      #
      # @api public
      module Wrap
        # Wrap other relations
        #
        # @example
        #   tasks.wrap(owner: [users, user_id: :id])
        #
        # @param [Hash] options
        #
        # @return [RelationProxy]
        #
        # @api public
        def wrap(options)
          wraps = options.map { |(name, (relation, keys))|
            relation.wrapped(name, keys)
          }

          relation = wraps.reduce(self) { |a, e|
            a.relation.for_wrap(e.meta.fetch(:keys), e.base_name.relation)
          }

          __new__(relation, meta: { wraps: wraps })
        end

        # Shortcut to wrap parents
        #
        # @example
        #   tasks.wrap_parent(owner: users)
        #
        # @return [RelationProxy]
        #
        # @api public
        def wrap_parent(options)
          wrap(
            options.each_with_object({}) { |(name, parent), h|
              keys = combine_keys(parent, relation, :children)
              h[name] = [parent, keys]
            }
          )
        end

        # Return a wrapped representation of a loading-proxy relation
        #
        # This will carry meta info used to produce a correct AST from a relation
        # so that correct mapper can be generated
        #
        # @return [RelationProxy]
        #
        # @api private
        def wrapped(name, keys)
          with(name: name, meta: { keys: keys, wrap: true, combine_name: name })
        end
      end
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
rom-repository-1.0.2 lib/rom/repository/relation_proxy/wrap.rb
rom-repository-1.0.1 lib/rom/repository/relation_proxy/wrap.rb
rom-repository-1.0.0 lib/rom/repository/relation_proxy/wrap.rb
rom-repository-1.0.0.rc2 lib/rom/repository/relation_proxy/wrap.rb
rom-repository-1.0.0.rc1 lib/rom/repository/relation_proxy/wrap.rb
rom-repository-1.0.0.beta3 lib/rom/repository/relation_proxy/wrap.rb
rom-repository-1.0.0.beta2 lib/rom/repository/relation_proxy/wrap.rb