Lighthouse has a new layout. Prefer the old one? Return to the old layout, and switch back any time from the link at the top of each page.

This project is archived and is in readonly mode.

named_scope with eager loading affects activerecord objects

#643

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">

Reported by elDub · July 17th, 2008 @ 04:50 PM

State: resolved
Milestone: 2.x
Assigned to: Frederick Cheung Frederick Cheung
Importance: none

Activity

  1. elDub
    elDub
    • 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.

    September 19th, 2008 @ 05:49 PM

  2. Frederick Cheung
    Frederick Cheung
    • 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

    December 19th, 2008 @ 01:38 AM

  3. Pratik
    Pratik
    • Assigned user set to Frederick Cheung

    December 19th, 2008 @ 02:07 PM

  4. Repository
    Repository
    • State changed from new to resolved

    (from [5cebe69e74d411c3c9e5f6ab9d4b2b16ee36177c]) Preload uses exclusive scope [#643 named_scope with eager loading affects activerecord objects 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...

    December 26th, 2008 @ 09:57 PM

  5. James Le Cuirot