Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ## attributes=
- def attributes=(new_attributes)
- 1505: return if new_attributes.nil?
- 1506: attributes = new_attributes.dup
- 1507: attributes.stringify_keys!
- 1508:
- 1509: multi_parameter_attributes = []
- 1510: remove_attributes_protected_from_mass_assignment(attributes).each do |k, v|
- 1511: k.include?("(") ? multi_parameter_attributes << [ k, v ] : send(k + "=", v)
- 1512: end
- 1513:
- 1514: assign_multiparameter_attributes(multi_parameter_attributes)
- 1515: end
- ## assign_multipleparameter_attributes
- def assign_multiparameter_attributes(pairs)
- execute_callstack_for_multiparameter_attributes(
- extract_callstack_for_multiparameter_attributes(pairs)
- )
- end
- # Includes an ugly hack for Time.local instead of Time.new because the latter is reserved by Time itself.
- def execute_callstack_for_multiparameter_attributes(callstack)
- errors = []
- callstack.each do |name, values|
- klass = (self.class.reflect_on_aggregation(name.to_sym) || column_for_attribute(name)).klass
- if values.empty?
- send(name + "=", nil)
- else
- begin
- send(name + "=", Time == klass ? klass.local(*values) : klass.new(*values))
- rescue => ex
- errors << AttributeAssignmentError.new("error on assignment #{values.inspect} to #{name}", ex, name)
- end
- end
- end
- unless errors.empty?
- raise MultiparameterAssignmentErrors.new(errors), "#{errors.size} error(s) on assignment of multiparameter attributes"
- end
- end
- def extract_callstack_for_multiparameter_attributes(pairs)
- attributes = { }
- for pair in pairs
- multiparameter_name, value = pair
- attribute_name = multiparameter_name.split("(").first
- attributes[attribute_name] = [] unless attributes.include?(attribute_name)
- unless value.empty?
- attributes[attribute_name] <<
- [ find_parameter_position(multiparameter_name), type_cast_attribute_value(multiparameter_name, value) ]
- end
- end
- attributes.each { |name, values| attributes[name] = values.sort_by{ |v| v.first }.collect { |v| v.last } }
- end
- def type_cast_attribute_value(multiparameter_name, value)
- multiparameter_name =~ /\([0-9]*([a-z])\)/ ? value.send("to_" + $1) : value
- end
- def find_parameter_position(multiparameter_name)
- multiparameter_name.scan(/\(([0-9]*).*\)/).first.first
- end
Add Comment
Please, Sign In to add comment