aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/associations/collection_association.rb
diff options
context:
space:
mode:
authorDominic Cleal <dominic@cleal.org>2016-10-06 13:47:26 +0100
committerDominic Cleal <dominic@cleal.org>2016-11-24 09:27:33 +0000
commit15e2da656f41af0124f7577858536f3b65462ad5 (patch)
tree1bbd1f076f37d73d79a1930e8b79d037e74364ef /activerecord/lib/active_record/associations/collection_association.rb
parent8556ab505a0a91efb529039b653984ab2b466a7e (diff)
downloadrails-15e2da656f41af0124f7577858536f3b65462ad5.tar.gz
rails-15e2da656f41af0124f7577858536f3b65462ad5.tar.bz2
rails-15e2da656f41af0124f7577858536f3b65462ad5.zip
Restore RecordNotFound when *_ids= can't find records by ID
9c9fb19 changed the behaviour of the _ids= setters for associations to raise an AssociationTypeMismatch when unknown IDs are given: Class: <ActiveRecord::AssociationTypeMismatch> Message: <"Developer(#43811860) expected, got NilClass(#16732720)"> This restores the original ActiveRecord::RecordNotFound exception with a much clearer error message: Class: <ActiveRecord::RecordNotFound> Message: <"Couldn't find all Developers with 'id': (1, -9999) [WHERE \"contracts\".\"company_id\" = ?] (found 1 results, but was looking for 2)"> Fixes #25719
Diffstat (limited to 'activerecord/lib/active_record/associations/collection_association.rb')
-rw-r--r--activerecord/lib/active_record/associations/collection_association.rb8
1 files changed, 6 insertions, 2 deletions
diff --git a/activerecord/lib/active_record/associations/collection_association.rb b/activerecord/lib/active_record/associations/collection_association.rb
index b2cf4713bb..99e6696c66 100644
--- a/activerecord/lib/active_record/associations/collection_association.rb
+++ b/activerecord/lib/active_record/associations/collection_association.rb
@@ -73,8 +73,12 @@ module ActiveRecord
ids.map! { |i| pk_type.cast(i) }
records = klass.where(reflection.association_primary_key => ids).index_by do |r|
r.send(reflection.association_primary_key)
- end.values_at(*ids)
- replace(records)
+ end.values_at(*ids).compact
+ if records.size != ids.size
+ scope.raise_record_not_found_exception!(ids, records.size, ids.size, reflection.association_primary_key)
+ else
+ replace(records)
+ end
end
def reset