This project is archived and is in readonly mode.
named_scope with eager loading affects activerecord objects
Reported by elDub | July 17th, 2008 @ 04:50 PM | in 2.x
Named scope with eager loading seems to affect activerecord objects to the point in which the object's relationships are broken.
Take this example class...
class Document < ActiveRecord::Base
has_one :revision, :class_name => 'Document', :foreign_key => 'prior_revision_id'
belongs_to :prior_revision, :class_name => 'Document', :foreign_key => 'prior_revision_id'
named_scope :active, :conditions => { :active => true }
named_scope :inactive, :conditions => { :active => false }
named_scope :both, :conditions => { :active => [true,false] }
end
...and this setup...
script/console
Loading development environment (Rails 2.1.0)
>> doc = Document.create(:active => false)
=> #<Document id: 1, prior_revision_id: nil, active: false, created_at: "2008-07-17 15:18:44", updated_at: "2008-07-17 15:18:44">
>> doc.create_revision(:active => true)
=> #<Document id: 2, prior_revision_id: 1, active: true, created_at: "2008-07-17 15:18:58", updated_at: "2008-07-17 15:18:58">
A basic test works...
>> test1 = Document.inactive.find(:first)
=> #<Document id: 1, prior_revision_id: nil, active: false, created_at: "2008-07-17 15:18:44", updated_at: "2008-07-17 15:18:44">
>> test1.revision
=> #<Document id: 2, prior_revision_id: 1, active: true, created_at: "2008-07-17 15:18:58", updated_at: "2008-07-17 15:18:58">
However, using eager loading, the scope has caused the resulting activerecord object to NOT be able to see the revision relationship.
>> test2 = Document.inactive.find(:first, :include => :revision)
=> #<Document id: 1, prior_revision_id: nil, active: false, created_at: "2008-07
-17 15:18:44", updated_at: "2008-07-17 15:18:44">
>> test2.revision
=> nil
I assume that because the revision relationship is itself of the Document class that THAT is the reason why it was not returned (it is active and the named scope was looking for inactive), though I don't agree that the relationship should be scoped. If the named scope is changed from 'inactive' to 'both', the revision relationship is visible.
To further confuse things, if I instead collect all the matching documents with an order clause referencing the join, things are back to normal.
>> test3 = Document.inactive.find(:all, :include => :revision, :order => 'revisions_documents.id')[0]
=> #<Document id: 1, prior_revision_id: nil, active: false, created_at: "2008-07-17 15:18:44", updated_at: "2008-07-17 15:18:44">
>> test3.revision
=> #<Document id: 2, prior_revision_id: 1, active: true, created_at: "2008-07-17 15:18:58", updated_at: "2008-07-17 15:18:58">
Comments and changes to this ticket
-
elDub September 19th, 2008 @ 05:49 PM
- Tag changed from 2.1, activerecord, bug, eager_loading, has_one, named_scope to 2.1, activerecord, bug, eager_loading, has_one, named_scope
Added failing test case.
-
Frederick Cheung December 19th, 2008 @ 01:38 AM
- Tag changed from 2.1, activerecord, bug, eager_loading, has_one, named_scope to 2.1, activerecord, bug, eager_loading, has_one, named_scope, patch
Resolves issue for me, but see discussion on mailing list
-
Pratik December 19th, 2008 @ 02:07 PM
- Assigned user set to Frederick Cheung
-
Repository December 26th, 2008 @ 09:57 PM
- State changed from new to resolved
(from [5cebe69e74d411c3c9e5f6ab9d4b2b16ee36177c]) Preload uses exclusive scope [#643 state:resolved]
With self referential associations, the scope for the the top level should not affect fetching of associations, for example when doing
Person.male.find :all, :include => :friends
we should load all of the friends for each male, not just the male friends. http://github.com/rails/rails/co...
Create your profile
Help contribute to this project by taking a few moments to create your personal profile. Create your profile »
<h2 style="font-size: 14px">Tickets have moved to Github</h2>
The new ticket tracker is available at <a href="https://github.com/rails/rails/issues">https://github.com/rails/rails/issues</a>
People watching this ticket
Attachments
Referenced by
- 643 named_scope with eager loading affects activerecord objects (from [5cebe69e74d411c3c9e5f6ab9d4b2b16ee36177c]) Preload...
- 2348 Eager loading does not respect default_scope This may be even more serious than I thought. I haven't t...