Jag tror inte att det är möjligt med SailsJS 0.10.5 för tillfället. Jag skulle faktiskt vilja göra samma sak, så jag bestämde mig för att implementera ett snabbt hack för detta ändamål.
Öppna filen sails/lib/hooks/blueprints/actionUtil.js
, redigeringsmetod populateEach
som nedan:
populateEach: function ( query, req ) {
var DEFAULT_POPULATE_LIMIT = sails.config.blueprints.defaultLimit || 30;
var _options = req.options;
var aliasFilter = req.param('populate');
var shouldPopulate = _options.populate;
// Convert the string representation of the filter list to an Array. We
// need this to provide flexibility in the request param. This way both
// list string representations are supported:
// /model?populate=alias1,alias2,alias3
// /model?populate=[alias1,alias2,alias3]
if (typeof aliasFilter === 'string') {
aliasFilter = aliasFilter.replace(/\[|\]/g, '');
aliasFilter = (aliasFilter) ? aliasFilter.split(',') : [];
}
return _(_options.associations).reduce(function populateEachAssociation (query, association) {
// If an alias filter was provided, override the blueprint config.
if (aliasFilter) {
shouldPopulate = _.contains(aliasFilter, association.alias);
}
// Only populate associations if a population filter has been supplied
// with the request or if `populate` is set within the blueprint config.
// Population filters will override any value stored in the config.
//
// Additionally, allow an object to be specified, where the key is the
// name of the association attribute, and value is true/false
// (true to populate, false to not)
if (shouldPopulate) {
// IMPORTANT NOTE: This is my trick. We should take advanced options from request parameter to make requests even more flexible
var populationOptions = req.param('populate_' + association.alias);
if (!populationOptions) {
var populationLimit = _options['populate_' + association.alias+'_limit'] ||
_options.populate_limit ||
_options.limit ||
DEFAULT_POPULATE_LIMIT;
populationOptions = {limit: populationLimit};
}
return query.populate(association.alias, populationOptions);
}
else {
return query;
}
}, query);
},
Jippie! Nu kan ditt API hantera ytterligare associationsfilter som nedan:
# POST /api/documents
{
"where" : {
// Normal conditions
}
"populate_user": {
// Advanced condition for association 'admin'
"where" : {
"role" : {
"like": "%Admin%"
}
},
"limit" : 4
}
}
Jag hoppas att det hjälper. Förresten, jag kommer att få tid att skicka en pull-förfrågan om denna förbättring till SailsJS core imorgon.
P/S:SailsJS-kärnan är ganska välgjord. Förmodligen är kärnanvändare helt enkelt för upptagna för att hantera alla funktionsförfrågningar. Låt oss bidra!