-
Type: Task
-
Resolution: Done
-
Affects Version/s: None
-
Component/s: None
-
None
I think, that whenever you use 'includes', there should be only performance difference, but not functional difference. But here's what I get:
>> CityRoute.includes(:orig).first
MOPED: 127.0.0.1:27017 QUERY database=gocheap_development collection=city_routes selector={"$query"=>{}, "$orderby"=>{:_id=>1}} flags=[:slave_ok] limit=-1 skip=0 batch_size=nil fields=nil (0.6924ms)
MOPED: 127.0.0.1:27017 QUERY database=gocheap_development collection=places selector={"deleted_at"=>nil, "_id"=>
#<CityRoute _id: 50d85fcbbdaa57462e000002 ... >
>> CityRoute.includes(:orig).first
MOPED: 127.0.0.1:27017 QUERY database=gocheap_development collection=city_routes selector={"$query"=>{}, "$orderby"=>{:_id=>1}} flags=[:slave_ok] limit=-1 skip=0 batch_size=nil fields=nil (0.6459ms)
MOPED: 127.0.0.1:27017 QUERY database=gocheap_development collection=places selector={"deleted_at"=>nil, "_id"=>{"$in"=>["4eda5f2e8792904be40001b7"]}
, "_type"=>{"$in"=>["City"]}} flags=[:slave_ok] limit=0 skip=0 batch_size=nil fields=nil (0.5293ms)
#<CityRoute _id: 50d85fcbbdaa57462e000002 ... >
>> CityRoute.first.orig
MOPED: 127.0.0.1:27017 QUERY database=gocheap_development collection=city_routes selector={"$query"=>{}, "$orderby"=>{:_id=>1}} flags=[:slave_ok] limit=-1 skip=0 batch_size=nil fields=nil (0.8597ms)
#<City _id: 4eda5f2e8792904be40001b7 ... >
So 'includes' doesn't use IdentityMap to get all or part of required records. So if I don't use 'includes', I get old records stored in ItentityMap, but if I use 'includes', the records are requested again and possibly they've already been changed (so that's the functional difference). Also, of course, to get the records from IdentityMap would be more efficient in terms of performance. Especially the difference is noticeable when you make something like '.includes(:orig, :dest)', when both the relations reference the same collection and included ids are nearly the same. This way the same set of records is requested twice in a row.