sql >> Database >  >> RDS >> PostgreSQL

sails.js Blueprint-query door relaties

Ik denk niet dat het voorlopig mogelijk is met SailsJS 0.10.5. Eigenlijk zou ik hetzelfde willen doen, dus besloot ik een snelle hack te implementeren voor dit doel.

Open bestand sails/lib/hooks/blueprints/actionUtil.js , bewerk methode populateEach zoals hieronder:

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);
},

Hoera! Nu kan uw API aanvullende associatiefilters aan, zoals hieronder:

# POST /api/documents
{
    "where" : {
        // Normal conditions
    }
    "populate_user": {
        // Advanced condition for association 'admin'
        "where" : {
            "role" : {
                 "like": "%Admin%"
            }
        },
        "limit" : 4    
     }
}

Ik hoop dat het helpt. Trouwens, ik zal morgen tijd vinden om een ​​pull-verzoek van deze verbetering naar SailsJS core te sturen.

P/S:De kern van SailsJS is redelijk goed gemaakt. Waarschijnlijk hebben core-committers het gewoon te druk om alle functieverzoeken af ​​te handelen. Laten we een bijdrage leveren!



  1. Converteer BufferedInputStream naar afbeelding

  2. 2 manieren om te controleren of gegevenstoegang is ingeschakeld in SQL Server (T-SQL-voorbeelden)

  3. Ontbrekende waarden in een MySQL-tabel interpoleren

  4. 2 manieren om alle tabelwaardige functies in een SQL Server-database op te sommen