Class: Opto::Model::Association::HasMany::Proxy

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/opto/model/association/has_many/proxy.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(parent, target_class, as, options = {}) ⇒ Proxy

Returns a new instance of Proxy.



10
11
12
13
14
# File 'lib/opto/model/association/has_many/proxy.rb', line 10

def initialize(parent, target_class, as, options = {})
  @parent, @target_class, @as = parent, target_class, as
  @options = { key_is: :name }.merge(options)
  @members = []
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(meth, *args) ⇒ Object



28
29
30
# File 'lib/opto/model/association/has_many/proxy.rb', line 28

def method_missing(meth, *args)
  members.send(meth, *args)
end

Instance Attribute Details

#asObject (readonly)

Returns the value of attribute as.



6
7
8
# File 'lib/opto/model/association/has_many/proxy.rb', line 6

def as
  @as
end

#membersObject (readonly)

Returns the value of attribute members.



6
7
8
# File 'lib/opto/model/association/has_many/proxy.rb', line 6

def members
  @members
end

#optionsObject (readonly)

Returns the value of attribute options.



6
7
8
# File 'lib/opto/model/association/has_many/proxy.rb', line 6

def options
  @options
end

#parentObject (readonly)

Returns the value of attribute parent.



6
7
8
# File 'lib/opto/model/association/has_many/proxy.rb', line 6

def parent
  @parent
end

#target_classObject (readonly)

Returns the value of attribute target_class.



6
7
8
# File 'lib/opto/model/association/has_many/proxy.rb', line 6

def target_class
  @target_class
end

Instance Method Details

#association_errorsObject



16
17
18
19
20
21
22
# File 'lib/opto/model/association/has_many/proxy.rb', line 16

def association_errors
  errors = { }
  if members.empty? && options[:required]
    errors[:presence] = "Collection '#{as}' is empty"
  end
  errors
end

#association_valid?Boolean

Returns:

  • (Boolean)


24
25
26
# File 'lib/opto/model/association/has_many/proxy.rb', line 24

def association_valid?
  association_errors.empty?
end

#errorsObject



50
51
52
53
54
55
56
57
58
# File 'lib/opto/model/association/has_many/proxy.rb', line 50

def errors
  result = { }
  each_with_index do |member, idx|
    errors = member.errors
    result[idx] = errors unless errors.empty?
  end
  result.merge!(association_errors || {})
  result.empty? ? {} : { as => result }
end

#new(*args) ⇒ Object



36
37
38
39
40
41
42
43
44
# File 'lib/opto/model/association/has_many/proxy.rb', line 36

def new(*args)
  if args.first.kind_of?(Hash) && args.size == 1 && args.first[args.first.keys.first].kind_of?(Hash)
    key = args.first.keys.first
    args = [args.first[key].merge(options[:key_is] => key.kind_of?(Symbol) ? key.to_s : key)]
  end
  target = target_class.new(*args)
  members << target
  target
end

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

Returns:

  • (Boolean)


32
33
34
# File 'lib/opto/model/association/has_many/proxy.rb', line 32

def respond_to_missing?(meth, include_private = false)
  members.respond_to?(meth, include_private)
end

#to_hObject



46
47
48
# File 'lib/opto/model/association/has_many/proxy.rb', line 46

def to_h
  empty? ? {} : { as => map(&:to_h) }
end