diff options
Diffstat (limited to 'lib/activeattr_ext.rb')
| -rw-r--r-- | lib/activeattr_ext.rb | 39 | 
1 files changed, 39 insertions, 0 deletions
| diff --git a/lib/activeattr_ext.rb b/lib/activeattr_ext.rb new file mode 100644 index 000000000..b4c112b72 --- /dev/null +++ b/lib/activeattr_ext.rb @@ -0,0 +1,39 @@ +module ActiveAttr::MultiParameterAttributes + +  def assign_attributes(new_attributes, options = {}) +    super( +      expand_multiparameter_attributes(new_attributes), +      options +    ) +  end + +  def expand_multiparameter_attributes(attributes) +    attributes ||= {} + +    single_parameter_attributes = {} +    multi_parameter_attributes = {} + +    attributes.each do |key, value| +      matches = key.match(/^(?<key>[^\(]+)\((?<index>\d+)i\)$/) + +      unless matches +        single_parameter_attributes[key] = value +        next +      end + +      args = (multi_parameter_attributes[matches['key']] ||= []) +      args[matches['index'].to_i - 1] = (value.present? ? value.to_i : nil) +    end + +    single_parameter_attributes.merge( +      multi_parameter_attributes.inject({}) do |hash, (key, args)| +        if args.all?(&:present?) +          hash.merge(key => _attribute_type(key).new(*args)) +        else +          hash +        end +      end +    ) +  end + +end | 
