diff options
author | Carlos Antonio da Silva <carlosantoniodasilva@gmail.com> | 2012-11-01 13:14:58 -0200 |
---|---|---|
committer | Carlos Antonio da Silva <carlosantoniodasilva@gmail.com> | 2012-11-01 13:50:56 -0200 |
commit | d37d40b2d702e9ff1461a3571f7f4d7ec52c2a2a (patch) | |
tree | 7fb38ee09914b73ca04a5d975e633df586976480 /activerecord | |
parent | f32f150e45f3dc3ccbd0adc1c91e6144b3cf1384 (diff) | |
download | rails-d37d40b2d702e9ff1461a3571f7f4d7ec52c2a2a.tar.gz rails-d37d40b2d702e9ff1461a3571f7f4d7ec52c2a2a.tar.bz2 rails-d37d40b2d702e9ff1461a3571f7f4d7ec52c2a2a.zip |
Fix issue with collection associations and first(n)/last(n)
When calling first(n) or last(n) in a collection, Active Record was
improperly trying to set the inverse of instance in case that option
existed. This change was introduced by
fdf4eae506fa9895e831f569bed3c4aa6a999a22.
In such cases we don't need to do that "manually", since the way
collection will be loaded will already handle that, so we just skip
setting the inverse association when any argument is given to
first(n)/last(n).
The test included ensures that these scenarios will have the inverse of
instance set properly.
Fixes #8087, Closes #8094.
Diffstat (limited to 'activerecord')
-rw-r--r-- | activerecord/CHANGELOG.md | 9 | ||||
-rw-r--r-- | activerecord/lib/active_record/associations/collection_association.rb | 2 | ||||
-rw-r--r-- | activerecord/test/cases/associations/inverse_associations_test.rb | 12 |
3 files changed, 20 insertions, 3 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index b89717fb40..3e071cfa01 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,5 +1,10 @@ ## Rails 3.2.9 (unreleased) +* Fix issue with collection associations calling first(n)/last(n) and attempting + to set the inverse association when `:inverse_of` was used. Fixes #8087. + + *Carlos Antonio da Silva* + * Fix bug when Column is trying to type cast boolean values to integer. Fixes #8067. @@ -10,7 +15,7 @@ *Grace Liu + Rafael Mendonça França* -* Fixed support for DATABASE_URL environment variable for rake db tasks. *Grace Liu* +* Fixed support for `DATABASE_URL` environment variable for rake db tasks. *Grace Liu* * Fix bug where `update_columns` and `update_column` would not let you update the primary key column. @@ -23,7 +28,7 @@ * Fix AR#dup to nullify the validation errors in the dup'ed object. Previously the original and the dup'ed object shared the same errors. - * Christian Seiler* + *Christian Seiler* * Synchronize around deleting from the reserved connections hash. Fixes #7955 diff --git a/activerecord/lib/active_record/associations/collection_association.rb b/activerecord/lib/active_record/associations/collection_association.rb index 2c852f6efc..43701708a4 100644 --- a/activerecord/lib/active_record/associations/collection_association.rb +++ b/activerecord/lib/active_record/associations/collection_association.rb @@ -571,7 +571,7 @@ module ActiveRecord args.shift if args.first.is_a?(Hash) && args.first.empty? collection = fetch_first_or_last_using_find?(args) ? scoped : load_target - collection.send(type, *args).tap {|it| set_inverse_instance it } + collection.send(type, *args).tap { |it| set_inverse_instance it if args.blank? } end end end diff --git a/activerecord/test/cases/associations/inverse_associations_test.rb b/activerecord/test/cases/associations/inverse_associations_test.rb index e03d7916f1..533192ea0e 100644 --- a/activerecord/test/cases/associations/inverse_associations_test.rb +++ b/activerecord/test/cases/associations/inverse_associations_test.rb @@ -265,6 +265,18 @@ class InverseHasManyTests < ActiveRecord::TestCase assert man.interests.last.man.equal? man end + def test_parent_instance_should_be_shared_with_first_n_and_last_n_children + man = Man.first + + interests = man.interests.first(2) + assert interests[0].man.equal? man + assert interests[1].man.equal? man + + interests = man.interests.last(2) + assert interests[0].man.equal? man + assert interests[1].man.equal? man + end + def test_trying_to_use_inverses_that_dont_exist_should_raise_an_error assert_raise(ActiveRecord::InverseOfAssociationNotFoundError) { Man.find(:first).secret_interests } end |