diff options
author | Matthew Draper <matthew@trebex.net> | 2016-11-25 00:48:00 +1030 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-11-25 00:48:00 +1030 |
commit | 33039fa7239afdde963fe651637226a7dca4b85b (patch) | |
tree | 8f27dc90159f788c19c01bdcea2b397753d57836 /activerecord/lib/active_record/associations | |
parent | 2f73982c215b6573bfa59e5a89471aedbd7c211a (diff) | |
parent | 935502062e647def60288944808240667f7893cc (diff) | |
download | rails-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')
-rw-r--r-- | activerecord/lib/active_record/associations/collection_association.rb | 10 |
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 |