Relación de objetos - Sails

Para este ejemplo se tiene dos modelos User y Carro, un User tendría muchos carros, una consulta SQL, necesitaríamos hacer una relación con join o algo parecido, sails lo que hacemos es un enlace simbolico al otro modelo definiendo cual va a ser con la colección y el medio de relación, de este modo se permite que realice una consulta que traiga el objeto user y los carros asociados, para esto creamos el modelo User de la siguiente forma:

"use strict";

/**
 * User
 * /api/models/User.js
 */

module.exports = {  
  connection: 'mongo',
  schema: true,
  attributes: {
    username: {
      type: 'string',
      required: true,
      unique: true,
      alphanumericdashed: true
    },

    password: {
      type: 'string'
    },

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


    Carros: {
      collection: 'carro',
      via:'owner'
    },

    toJSON() {
      let obj = this.toObject();
      delete obj.password;
      delete obj.socialProfiles;
      return obj;
    }
  },

  beforeUpdate(values, next) {
    if (false === values.hasOwnProperty('password')) return next();
    if (/^\$2[aby]\$[0-9]{2}\$.{53}$/.test(values.password)) return next();

    return HashService.bcrypt.hash(values.password)
      .then(hash => {
        values.password = hash;
        next();
      })
      .catch(next);
  },

  beforeCreate(values, next) {
    if (false === values.hasOwnProperty('password')) return next();

    return HashService.bcrypt.hash(values.password)
      .then(hash => {
        values.password = hash;
        next();
      })
      .catch(next);
  }
};

Como se observa se creo la propiedad carros,

carros: {  
      collection: 'carro',
      via:'owner'
    },

en este se define a que modelo va ir relacionada en este caso a carro, y la forma de relación con el otro modelo va ser owner, el modelo Carro.js tendria la siguiente información

"use strict";

/**
 * Carro
 */

module.exports = {  
  schema: true,
  connection: 'postgresql',
  attributes: {

    nombre: {
      type: 'string',
      required: true
    },
    modelo: {
      type: 'string',
      required: true
    },
    owner: {
      model: 'user'
    },

    toJSON() {
      return this.toObject();
    }
  },

  beforeUpdate: (values, next) => next(),
  beforeCreate: (values, next) => next()
};

En este modelo se define la propiedad owner, cual hace relación al modelo user.

con estas propiedades definidas se puede realizar las siguientes consulta en el controlador

Carro.find({owner:res.user.id}).exec(function(err, data) {  
     if(!err) {
         res.json(data)
     }            
})

Retorna el objeto, donde owner corresponde el id del usuario en la base de datos

[
  {
    "owner": "586bc30f6e242ebd691c53c9",
    "nombre": "Carro 2",
    "modelo": "xDG2",
    "id": 1,
    "createdAt": "2017-01-03T17:18:28.000Z",
    "updatedAt": "2017-01-03T17:18:28.000Z"
  }
]

Otra consulta que se puede realizar el traer el usuario con todos los carros asociados para esto tendríamos que hacer el join pero en sails no es necesario la consulta la realizaríamos de la siguiente forma

  User.find()
      .populate('celulares')
      .exec(function(err, data){
            console.log(data)
        })

Quien hace la magia de traer los carros es populate quien busca la propiedad celulares que se definió en el modelo

[
  {
    "celulares": [
      {
        "nombre": "Carro 2",
        "modelo": "xDG2",
        "id": 1,
        "createdAt": "2017-01-03T17:18:28.000Z",
        "updatedAt": "2017-01-03T17:18:28.000Z",
        "owner": "586bc30f6e242ebd691c53c9"
      }
    ],
    "username": "debian789",
    "email": "debian789@gmail.com",
    "createdAt": "2017-01-03T15:28:15.979Z",
    "updatedAt": "2017-01-03T15:28:15.979Z",
    "id": "586bc30f6e242ebd691c53c9"
  }
]

Hasta hay todo normal una consulta de datos relacionales, pero si te fijas el modelo de carro esta configurado con el driver de postgresql y el modelo de usuario esta con el driver de mongodb, en futuros manuales explicare con mas detalle como crear un proyecto completo con sails