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