Guest User

Untitled

a guest
Feb 19th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.60 KB | None | 0 0
  1. ## attributes=
  2.  
  3. def attributes=(new_attributes)
  4. 1505: return if new_attributes.nil?
  5. 1506: attributes = new_attributes.dup
  6. 1507: attributes.stringify_keys!
  7. 1508:
  8. 1509: multi_parameter_attributes = []
  9. 1510: remove_attributes_protected_from_mass_assignment(attributes).each do |k, v|
  10. 1511: k.include?("(") ? multi_parameter_attributes << [ k, v ] : send(k + "=", v)
  11. 1512: end
  12. 1513:
  13. 1514: assign_multiparameter_attributes(multi_parameter_attributes)
  14. 1515: end
  15.  
  16. ## assign_multipleparameter_attributes
  17.  
  18. def assign_multiparameter_attributes(pairs)
  19. execute_callstack_for_multiparameter_attributes(
  20. extract_callstack_for_multiparameter_attributes(pairs)
  21. )
  22. end
  23.  
  24. # Includes an ugly hack for Time.local instead of Time.new because the latter is reserved by Time itself.
  25. def execute_callstack_for_multiparameter_attributes(callstack)
  26. errors = []
  27. callstack.each do |name, values|
  28. klass = (self.class.reflect_on_aggregation(name.to_sym) || column_for_attribute(name)).klass
  29. if values.empty?
  30. send(name + "=", nil)
  31. else
  32. begin
  33. send(name + "=", Time == klass ? klass.local(*values) : klass.new(*values))
  34. rescue => ex
  35. errors << AttributeAssignmentError.new("error on assignment #{values.inspect} to #{name}", ex, name)
  36. end
  37. end
  38. end
  39. unless errors.empty?
  40. raise MultiparameterAssignmentErrors.new(errors), "#{errors.size} error(s) on assignment of multiparameter attributes"
  41. end
  42. end
  43.  
  44. def extract_callstack_for_multiparameter_attributes(pairs)
  45. attributes = { }
  46.  
  47. for pair in pairs
  48. multiparameter_name, value = pair
  49. attribute_name = multiparameter_name.split("(").first
  50. attributes[attribute_name] = [] unless attributes.include?(attribute_name)
  51.  
  52. unless value.empty?
  53. attributes[attribute_name] <<
  54. [ find_parameter_position(multiparameter_name), type_cast_attribute_value(multiparameter_name, value) ]
  55. end
  56. end
  57.  
  58. attributes.each { |name, values| attributes[name] = values.sort_by{ |v| v.first }.collect { |v| v.last } }
  59. end
  60.  
  61. def type_cast_attribute_value(multiparameter_name, value)
  62. multiparameter_name =~ /\([0-9]*([a-z])\)/ ? value.send("to_" + $1) : value
  63. end
  64.  
  65. def find_parameter_position(multiparameter_name)
  66. multiparameter_name.scan(/\(([0-9]*).*\)/).first.first
  67. end
Add Comment
Please, Sign In to add comment