Method: Mongoid::MultiParameterAttributes#process

Defined in:
lib/mongoid/multi_parameter_attributes.rb

#process(attrs = nil, role = :default, guard_protected_attributes = true) ⇒ Object

Process the provided attributes casting them to their proper values if a field exists for them on the document. This will be limited to only the attributes provided in the suppied Hash so that no extra nil values get put into the document’s attributes.

Examples:

Process the attributes.

person.process(:title => "sir", :age => 40)

Since:

  • 2.0.0.rc.7



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/mongoid/multi_parameter_attributes.rb', line 51

def process(attrs = nil, role = :default, guard_protected_attributes = true)
  if attrs
    errors = []
    attributes = {}
    multi_parameter_attributes = {}

    attrs.each_pair do |key, value|
      if key =~ /^([^\(]+)\((\d+)([if])\)$/
        key, index = $1, $2.to_i
        (multi_parameter_attributes[key] ||= {})[index] = value.empty? ? nil : value.send("to_#{$3}")
      else
        attributes[key] = value
      end
    end

    multi_parameter_attributes.each_pair do |key, values|
      begin
        values = (values.keys.min..values.keys.max).map { |i| values[i] }
        field = self.class.fields[key]
        attributes[key] = instantiate_object(field, values)
      rescue => e
        errors << Errors::AttributeAssignmentError.new(
          "error on assignment #{values.inspect} to #{key}", e, key
        )
      end
    end

    unless errors.empty?
      raise(
        Errors::MultiparameterAssignmentErrors.new(errors),
        "#{errors.size} error(s) on assignment of multiparameter attributes"
      )
    end

    super attributes, role, guard_protected_attributes
  else
    super
  end
end