PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

sails.js Zapytanie Blueprint według relacji

Na razie nie wydaje mi się, żeby było to możliwe z SailsJS 0.10.5. Właściwie chciałbym zrobić to samo, więc zdecydowałem się zaimplementować w tym celu szybki hack.

Otwórz plik sails/lib/hooks/blueprints/actionUtil.js , edytuj metodę populateEach jak poniżej:

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

Tak! Teraz Twój interfejs API może obsługiwać dodatkowe filtry asocjacji, takie jak poniżej:

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

Mam nadzieję, że to pomoże. Przy okazji znajdę czas, aby jutro wysłać prośbę o wprowadzenie tego ulepszenia do rdzenia SailsJS.

P/S:Rdzeń SailsJS jest całkiem dobrze wykonany. Prawdopodobnie główni twórcy są zbyt zajęci, aby obsłużyć wszystkie prośby o nowe funkcje. Współpracujmy!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. postgresql - skrypt używający bloków transakcji nie tworzy wszystkich rekordów

  2. Jaki jest właściwy sposób pracy z wynikami strumieniowania w wersji 3.0.0 i Postgresql?

  3. Zgrupowane LIMIT w PostgreSQL:pokazać pierwsze N ​​wierszy dla każdej grupy?

  4. Czy należy przechowywać strefę czasową oddzielnie od sygnatury czasowej Postgres i JDBC?

  5. Jak połączyć się z bazą danych PostgreSQL przez SSL?