aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/associations/collection_association.rb
diff options
context:
space:
mode:
authorMatthew Draper <matthew@trebex.net>2016-11-25 00:48:00 +1030
committerGitHub <noreply@github.com>2016-11-25 00:48:00 +1030
commit33039fa7239afdde963fe651637226a7dca4b85b (patch)
tree8f27dc90159f788c19c01bdcea2b397753d57836 /activerecord/lib/active_record/associations/collection_association.rb
parent2f73982c215b6573bfa59e5a89471aedbd7c211a (diff)
parent935502062e647def60288944808240667f7893cc (diff)
downloadrails-33039fa7239afdde963fe651637226a7dca4b85b.tar.gz
rails-33039fa7239afdde963fe651637226a7dca4b85b.tar.bz2
rails-33039fa7239afdde963fe651637226a7dca4b85b.zip
Merge pull request #26718 from domcleal/5-0-stable-ids-writer-exception
Restore RecordNotFound when *_ids= can't find records by ID
Diffstat (limited to 'activerecord/lib/active_record/associations/collection_association.rb')
-rw-r--r--activerecord/lib/active_record/associations/collection_association.rb10
1 files changed, 7 insertions, 3 deletions
diff --git a/activerecord/lib/active_record/associations/collection_association.rb b/activerecord/lib/active_record/associations/collection_association.rb
index b2cf4713bb..3d23fa1e46 100644
--- a/activerecord/lib/active_record/associations/collection_association.rb
+++ b/activerecord/lib/active_record/associations/collection_association.rb
@@ -68,13 +68,17 @@ module ActiveRecord
# Implements the ids writer method, e.g. foo.item_ids= for Foo.has_many :items
def ids_writer(ids)
- pk_type = reflection.primary_key_type
+ pk_type = reflection.association_primary_key_type
ids = Array(ids).reject(&:blank?)
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