This project is archived and is in readonly mode.

#643 ✓resolved
elDub

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

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>

Referenced by

Pages