 
 
     isQueryReady: (qs) ->
+        qsString = EJSON.stringify qs
         modelClass = J.models[qs.modelName]
+
         qs = J.util.deepClone qs
         if not J.util.isPlainObject qs.selector
+            # Note that this makes qs inconsistent with qsString
             qs.selector = _id: qs.selector
 
         helper = =>
+            return true if qsString of @_unmergedQsSet and qsString of @_nextUnmergedQsSet
+
             if _.isString(qs.selector._id) and qs.selector._id of modelClass.collection._attachedInstances
-                return true
-
-            qsString = EJSON.stringify qs
-            return true if qsString of @_mergedQsSet and qsString of @_nextMergedQsSet
+                # For queries with an _id filter, say it's ready as long as minimongo
+                # has an attached entry with that _id and no other parts of the selector
+                # rule out the one possible match.
+                options = @_qsToFindOptions(qs)
+                options.transform = false
+                options.reactive = false
+                return modelClass.findOne(qs.selector, options)?
 
             false
 
         ret = helper()
-        if not ret then console.log 'isQueryReady', ret, qs
+        if ret is false then console.log 'isQueryReady', ret, qsString
         ret
 
 


        if @isQueryReady querySpec
            modelClass = J.models[querySpec.modelName]
            options = {}
            for optionName in ['fields', 'sort', 'skip', 'limit']
                if querySpec[optionName]? then options[optionName] = querySpec[optionName]

            if Tracker.active
                results = J.List Tracker.nonreactive ->

                Tracker.afterFlush (=> @remergeQueries()), Number.POSITIVE_INFINITY


    requestQuery: (querySpec) ->
        J.assert Tracker.active

