Class: ROM::Relation::Curried

Inherits:
Object
  • Object
show all
Includes:
Materializable
Defined in:
core/lib/rom/relation/curried.rb

Overview

Curried relation is a special relation proxy used by auto-curry mechanism.

When a relation view method is called without all arguments, a curried proxy is returned that can be fully applied later on.

Curried relations are typically used for relation composition

Instance Attribute Summary collapse

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(meth, *args, &block) ⇒ Object (private)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'core/lib/rom/relation/curried.rb', line 110

def method_missing(meth, *args, &block)
  if relation.respond_to?(meth)
    response = relation.__send__(meth, *args, &block)

    super if response.is_a?(self.class)

    if response.is_a?(Relation) || response.is_a?(Graph) || response.is_a?(Wrap) || response.is_a?(Composite)
      __new__(response)
    else
      response
    end
  else
    super
  end
end

Instance Attribute Details

#arityInteger (readonly)

Returns View's arity.

Returns:

  • (Integer)

    View's arity



40
# File 'core/lib/rom/relation/curried.rb', line 40

option :arity, type: Types::Strict::Integer

#curry_argsArray (readonly)

Returns Arguments that will be passed to curried view.

Returns:

  • (Array)

    Arguments that will be passed to curried view



44
# File 'core/lib/rom/relation/curried.rb', line 44

option :curry_args, default: -> { EMPTY_ARRAY }

#relationRelation (readonly)

Returns The source relation that is curried.

Returns:

  • (Relation)

    The source relation that is curried



32
# File 'core/lib/rom/relation/curried.rb', line 32

param :relation

#viewSymbol (readonly)

Returns The name of relation's view method.

Returns:

  • (Symbol)

    The name of relation's view method



36
# File 'core/lib/rom/relation/curried.rb', line 36

option :view, type: Types::Strict::Symbol

Instance Method Details

#call(*args) ⇒ Loaded, Curried Also known as: []

Load relation if args match the arity

Returns:



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'core/lib/rom/relation/curried.rb', line 51

def call(*args)
  all_args = curry_args + args

  if all_args.empty?
    raise ArgumentError, "curried #{relation.class}##{view} relation was called without any arguments"
  end

  if args.empty?
    self
  elsif arity == all_args.size
    Loaded.new(relation.__send__(view, *all_args))
  else
    __new__(relation, curry_args: all_args)
  end
end

#each {|Hash, Object| ... } ⇒ Object Originally defined in module Materializable

Yield relation tuples

Yields:

  • (Hash, Object)

#firstObject Originally defined in module Materializable

Return first tuple from a relation coerced to an array

Returns:

  • (Object)

#oneObject Originally defined in module Materializable

Delegate to loaded relation and return one object

Returns:

  • (Object)

See Also:

#one!Object Originally defined in module Materializable

Delegate to loaded relation and return one object

Returns:

  • (Object)

See Also:

#to_aObject Also known as: to_ary

Relations are coercible to an array but a curried relation cannot be coerced When something tries to do this, an exception will be raised

Raises:

  • ArgumentError



74
75
76
77
78
79
80
# File 'core/lib/rom/relation/curried.rb', line 74

def to_a
  raise(
    ArgumentError,
    "#{relation.class}##{view} arity is #{arity} " \
    "(#{curry_args.size} args given)"
  )
end