mongoid/mongoid — Issue #1371: Eager_load won't trigger with includes() for inherited classes
Author: maximeg
Created: 2011-10-21 19:30:32+00:00
State: open

Consering :

class Thing
include Mongoid::Document

has_many :tasks
end

class Kase < Thing
end
class Deal < Thing
end

class Task
include Mongoid::Document

belongs_to :thing
end

My Thing class is never instantiated. Only Deal & Kase.

Doing :

@tasks = Task.includes(:thing)
@tasks.each do |task|
puts task.thing.name #for example
end

won't trigger the eager load :

MONGODB max_simple_crm_development['tasks'].find({"tenant_id"=>BSON::ObjectId('4e7618e6f581f90c73000001'), :done_at=>nil}, {"thing_id"=>1})
MONGODB max_simple_crm_development['things'].find({"_id"=>{"$in"=>[BSON::ObjectId('4e6a6ca8f581f95883000003'), BSON::ObjectId('4e9bdd56f581f90a5d000004'), BSON::ObjectId('4dc80859f581f90944000014')]}})

MONGODB max_simple_crm_development['tasks'].find({"tenant_id"=>BSON::ObjectId('4e7618e6f581f90c73000001'), :done_at=>nil}).limit(50).sort([[:due_at, :asc]])

MONGODB max_simple_crm_development['things'].find({:_id=>BSON::ObjectId('4e6a6ca8f581f95883000003')}).limit(-1).sort([[:_id, :asc]])

The document with id=4e6a6ca8f581f95883000003 is loaded via the includes special criteria (1st & 2nd line of the log).
But, it is still fetched from DB as the last line of the log shows.

And as its class is Kase, it is stored in the Kase "identity_map repository" (documents_for(:kase)).
https://github.com/mongoid/mongoid/blob/master/lib/mongoid/relations/referenced/in.rb#L129

But on the criteria emerging from the relation to fetch the Kase (that is referenced as a Thing in the metadata),
the "from_map_or_db" fucntion looks in the "Thing identity_map repository" (documents_for(:thing)).

At less, that is what i understood.