Ze Luis
Ze Luis

Reputation: 236

Sails/Waterline Populate doesn't work as expected

I'm bangin' my head against the wall in the last hours, and I can't figure out a solution to my problem. In my sails models, I have 2 one-to-many associations. 'A' model can have many 'B', and 'B' model can have many 'C'. In my controller, when I do a.find().populate('b') (...) it returns me the entire collection of A model, but populate each entry of A model with only one B, which doesn't match the current dataset I have in my database(mysql). And doesn't populate the C entries in the B model. In other words, I'm trying to achieve something like nested population.
It's something wrong with the Controller code, right? How can I make this work? Thanks in advance!

EDIT:

Company.js

module.exports = {

identity: 'company',

attributes: {

    name: {
        type: 'string',
        required: true
    },

    address: {
        type: 'string',
        required: true
    },

    zip_code: {
        type: 'string',
        required: true
    },

    city: {
        type: 'string',
        required: true
    },

    nif: {
        type: 'integer',
        required: true,
        minLength: 9
    },

    country: {
        type: 'string',
        required: true
    },

    phone_number: {
        type: 'string',
        required: true
    },

    email: {
        type: 'email',
        required: true
    },

    facilities: {
        collection: 'facility',
        references: 'facility',
        on: 'id',
        via: 'company'
    }
  }
};

Facility.js

module.exports = {

identity: 'facility',

attributes: {

    company: {
        columnName: 'id_company',
        model: 'company'
    },

    warehouses: {
        collection: 'warehouse',
        references: 'warehouse',
        on: 'id',
        via: 'facility'
    },

    name: {
        type: 'string',
        required: true
    },

    address: {
        type: 'string',
        required: true
    },

    zip_code: {
        type: 'string',
        required: true
    },

    city: {
        type: 'string',
        required: true
    },

    country: {
        type: 'string',
        required: true
    },

    phone_number: {
        type: 'string',
    },

    email: {
        type: 'email',
    },

    longitude: {
        type: 'float',
    },

    latitude: {
        type: 'float'
    }

  }
};

Warehouse.js

module.exports = {

identity: 'warehouse',

attributes: {

    facility: {
        columnName: 'id_facility',
        model: 'facility',
    },

    name: {
        type: 'string',
        required: true
    },

    longitude: {
        type: 'float',
    },

    latitude: {
        type: 'float'
    }

  }
};

MainController's relevant code:

companies: function(req, res) {
    company.find().populate('facilities').exec(function(err, comp){
        var error = '';
        if(err){
            error = 'Unable to retrieve the requested information. Try again later and, if the problem persists, contact the platform administrator.';
        } else if(!comp[0]) {
            error = 'There\'s no company data inserted.';
        }
        // (...)
    });

},

Upvotes: 0

Views: 1197

Answers (1)

roign
roign

Reputation: 462

You should remove the references and on from your models.

Regarding nested population, just like I said in the comment, Waterline does not currently support it. You could check Waterline2 which, as they say, offers the possibility of nested populating, but is not recommended for production.
Otherwise you could check this out: Sails.js populate nested associations

Upvotes: 1

Related Questions