Class: ROM::Relation::Curried

Inherits:
Object
  • Object
show all
Extended by:
Initializer
Includes:
Pipeline, Materializable
Defined in:
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 '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 '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 '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 '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 'lib/rom/relation/curried.rb', line 36

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

Instance Method Details

#>>(other) ⇒ Relation::Composite Originally defined in module Pipeline::Operator

Compose two relation with a left-to-right composition

Examples:

users.by_name('Jane') >> tasks.for_users

Parameters:

  • other (Relation)

    The right relation

Returns:

#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 '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

#curried?true

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.

Return if this lazy relation is curried

Returns:

  • (true)

88
89
90
# File 'lib/rom/relation/curried.rb', line 88

def curried?
  true
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)

#map_with(*names) ⇒ Relation::Composite Originally defined in module Pipeline

Send data through specified mappers

Returns:

#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:

#respond_to_missing?(name, include_private = false) ⇒ Boolean

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.

Returns:

  • (Boolean)

93
94
95
# File 'lib/rom/relation/curried.rb', line 93

def respond_to_missing?(name, include_private = false)
  super || relation.respond_to?(name, include_private)
end

#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 'lib/rom/relation/curried.rb', line 74

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