diff options
author | Severin Schoepke <severin.schoepke@gmail.com> | 2013-12-05 15:57:05 +0100 |
---|---|---|
committer | Severin Schoepke <severin.schoepke@gmail.com> | 2013-12-05 16:03:07 +0100 |
commit | f1a646fa74290db32fb52bb373791891ab73d693 (patch) | |
tree | 9701a5c8a35828fd619a3af91042e2cde432f6f4 /activerecord/lib | |
parent | f0c58621f104492aa1c2b6cb13ecb2d6c60541fa (diff) | |
download | rails-f1a646fa74290db32fb52bb373791891ab73d693.tar.gz rails-f1a646fa74290db32fb52bb373791891ab73d693.tar.bz2 rails-f1a646fa74290db32fb52bb373791891ab73d693.zip |
polymorphic belongs_to association with touch: true updates old record correctly
Example: Given you have a comments model with a polymorphic commentable
association (e.g. books and songs) with the touch option set.
Every time you update a comment its commentable should be touched.
This was working when you changed attributes on the comment or when you
moved the comment from one book to another. However, it was not working
when moving a comment from a book to a song. This is now fixed.
Diffstat (limited to 'activerecord/lib')
-rw-r--r-- | activerecord/lib/active_record/associations/builder/belongs_to.rb | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/associations/builder/belongs_to.rb b/activerecord/lib/active_record/associations/builder/belongs_to.rb index ac387d377d..e8e36e7cd0 100644 --- a/activerecord/lib/active_record/associations/builder/belongs_to.rb +++ b/activerecord/lib/active_record/associations/builder/belongs_to.rb @@ -91,7 +91,13 @@ module ActiveRecord::Associations::Builder old_foreign_id = o.changed_attributes[foreign_key] if old_foreign_id - klass = o.association(name).klass + association = o.association(name) + reflection = association.reflection + if reflection.polymorphic? + klass = o.public_send("#{reflection.foreign_type}_was").constantize + else + klass = association.klass + end old_record = klass.find_by(klass.primary_key => old_foreign_id) if old_record |