PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

sails.js Blueprint заявка по отношения

Не мисля, че е възможно с SailsJS 0.10.5 за сега. Всъщност бих искал да направя същото, затова реших да внедря бърз хак за тази цел.

Отворете файла sails/lib/hooks/blueprints/actionUtil.js , метод за редактиране populateEach като по-долу:

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

Ура! Сега вашият API може да обработва допълнителни филтри за асоцииране като по-долу:

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

Надявам се, че помага. Между другото ще намеря време да изпратя заявка за изтегляне на това подобрение в ядрото на SailsJS утре.

P/S:Ядрото на SailsJS е доста добре направено. Вероятно основните изпълнители са твърде заети, за да се справят с всички заявки за функции. Нека допринесем!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да създам ограничение, за да проверя дали имейл е валиден в postgres?

  2. SQLException:Този ResultSet е затворен

  3. ограничение на размера/дължината на типа масив в PostgreSQL

  4. Агрегираните функции не са разрешени в рекурсивна заявка. Има ли алтернативен начин за написване на тази заявка?

  5. Функция JPA lower() на параметър