diff --git a/activerecord/lib/active_record/attribute_methods/primary_key.rb b/activerecord/lib/active_record/attribute_methods/primary_key.rb index 63759ad462e16..8af0442a79ca3 100644 --- a/activerecord/lib/active_record/attribute_methods/primary_key.rb +++ b/activerecord/lib/active_record/attribute_methods/primary_key.rb @@ -31,6 +31,7 @@ def primary_key_values_present? # :nodoc: # Sets the primary key column's value. def id=(value) if self.class.composite_primary_key? + raise TypeError, "Expected value matching #{self.class.primary_key.inspect}, got #{value.inspect}." unless value.is_a?(Enumerable) @primary_key.zip(value) { |attr, value| _write_attribute(attr, value) } else _write_attribute(@primary_key, value) diff --git a/activerecord/test/cases/primary_keys_test.rb b/activerecord/test/cases/primary_keys_test.rb index 36411593cd9a3..56f199aaa1486 100644 --- a/activerecord/test/cases/primary_keys_test.rb +++ b/activerecord/test/cases/primary_keys_test.rb @@ -426,9 +426,11 @@ def test_assigning_a_composite_primary_key def test_assigning_a_non_array_value_to_model_with_composite_primary_key_raises book = Cpk::Book.new - assert_raises(TypeError) do + error = assert_raises(TypeError) do book.id = 1 end + + assert_equal("Expected value matching [\"author_id\", \"number\"], got 1.", error.message) end def test_id_was_composite