docs: function(options) {
              options = options || {};
  
              //find ids that we don't have in cache and aren't already in the process of being fetched.
              var idsNotInCache = _.difference(this.getTrackedIds(), _.pluck(parentInstance.models, 'id'));
              var idsWithPromises = _.pick(parentInstance.idPromises, idsNotInCache);
  
              // Determine which ids are already being fetched and the associated promises for those ids.
              options.idsToFetch = _.difference(idsNotInCache, _.uniq(_.flatten(_.keys(idsWithPromises))));
              var thisFetchPromise = this.fetch(options);
  
              // Return a promise that resolves when all ids are fetched (including pending ids).
              var allPromisesToWaitFor = _.flatten(_.values(idsWithPromises));
              allPromisesToWaitFor.push(thisFetchPromise);
              var allUniquePromisesToWaitFor = _.uniq(allPromisesToWaitFor);
              return $.when.apply($, allUniquePromisesToWaitFor)
                // Make it look like the multiple promises was performed by a single request.
                .then(function() {
                  // collects the parts of each ajax call into arrays: result = { [data1, data2, ...], [textStatus1, textStatus2, ...], [jqXHR1, jqXHR2, ...] };
                  var result = _.zip(arguments);
                  // Flatten the data so it looks like the result of a single request.
                  var resultData = result[0];
                  var flattenedResultData = _.flatten(resultData);
                  return flattenedResultData;
                });
            }