Iman  Mohamadi
Iman Mohamadi

Reputation: 6839

Is there a bettery way to work with nested(associated) models in Sails JS?

I've connected my SailsJs app to a Mongodb database. I'm working on an analytic application. These are the major models in my application:

User Project Report Event

A user can have many projects, a project can have many reports and a report can have many events. I have created these relations using collection and model properties of my models attributes. My problem is why is it so hard to find events of specific user? I wish I could do this:

User.
  find({id: id}).
  populate('projects').
  populate('reports').
  populate('events').
  then(function (eventsOfMyUser) {
  });

but since only projects is an attribute of my User model only the first populate works. Shouldn't be an easier way to find a deep model rather than writing nasty and confusing async loops in my controller or model code?

Upvotes: 0

Views: 723

Answers (2)

Bonanza
Bonanza

Reputation: 1621

Right now there is a hook that allows you to do that. It is changing waterline with Offshore. Offshore is extended fork of Waterline with deep populate, cache mechanism.

sails-hook-orm-offshore

In the road map right now there are:

  • Associations Criteria (add default criteria to association)
  • Transactions

Upvotes: 0

Boris Zagoruiko
Boris Zagoruiko

Reputation: 13174

At the moment sails doesn't have any kind of nested population. The issue to reference: https://github.com/balderdashy/waterline/issues/308

Worth saying there's a pull request to add nested population: https://github.com/balderdashy/waterline/pull/1052

Pull request isn't merged at the moment but you can use it installing one directly with

npm i Atlantis-Software/waterline#deepPopulate

With it you can do something like .populate('projects.reports ...)'.

Upvotes: 3

Related Questions