diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index 60fd995..22a801a 100755 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -2680,11 +2680,18 @@ module ActiveRecord #:nodoc: unless value.empty? attributes[attribute_name] << - [ find_parameter_position(multiparameter_name), type_cast_attribute_value(multiparameter_name, value) ] + [ find_parameter_position(multiparameter_name).to_i, 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 } } + attributes.each do |name, values| + values = values.sort_by{ |v| v.first } + attributes[name] = if values.empty? || values.last.first > values.size + [] + else + values.collect { |v| v.last } + end + end end def type_cast_attribute_value(multiparameter_name, value) diff --git a/activerecord/test/cases/base_test.rb b/activerecord/test/cases/base_test.rb index 8725c76..3caa82f 100755 --- a/activerecord/test/cases/base_test.rb +++ b/activerecord/test/cases/base_test.rb @@ -971,6 +971,13 @@ class BasicsTest < ActiveRecord::TestCase assert_date_from_db Date.new(2004, 6, 1), topic.last_read.to_date end + def test_multiparameter_attributes_on_date_with_empty_year + attributes = { "last_read(1i)" => "", "last_read(2i)" => "6", "last_read(3i)" => "1" } + topic = Topic.find(1) + topic.attributes = attributes + assert_nil topic.last_read + end + def test_multiparameter_attributes_on_date_with_all_empty attributes = { "last_read(1i)" => "", "last_read(2i)" => "", "last_read(3i)" => "" } topic = Topic.find(1)