0.0.1 • Published 7 years ago

sails-sequelize-nested v0.0.1

Weekly downloads
3
License
MIT
Repository
github
Last release
7 years ago

Sails Sequelize Nested

A simple helper, allows you to do nested creates with Sequelize + Sails.

Installation

Motivation

As you may notice, nested create can be really tricky with sequelize. You have to include all nested associations like so:

Product.create({
  title: 'Chair',
  user: {
    first_name: 'Mick',
    last_name: 'Broadstone',
  }
}, {
  include: [{ association: Product.User }]
});

Things are getting even more complicated if you have an association including another association.

Product.create({
  title: 'Chair',
  user: {
    first_name: 'Mick',
    last_name: 'Broadstone',
    address: {
      city: 'Austin',
      state: 'TX',
      zip: '78704'
    }
  }
}, {
  include: [{
    association: Product.User,
    include: [ User.Address ]
  }]
});

You constantly need to track all includes. I don't really understand why it was made that complicated way in sequelize. You can read all includes from the schema, and add it if needed automatically.

That module solves this problem by extending sails models with nested methods.

Avaliable methods

  • Model.createNested(record)
ArgumentTypeDetails
1modelStringA model name.
2recordObjectAn Object that is to be created.

Returns: Promise

Usage

Consider the following models:

const Product = this.sequelize.define('product', {
  title: Sequelize.STRING
});
const User = this.sequelize.define('user', {
  first_name: Sequelize.STRING,
  last_name: Sequelize.STRING
});
const Address = this.sequelize.define('address', {
  city: Sequelize.STRING,
  state: Sequelize.STRING,
  zip: Sequelize.STRING,
});

Product.User = Product.belongsTo(User);
User.Address = User.belongsTo(Address);

A new Product, User, and Address can be created in one step in the following way:

Product.createNested({
  title: 'Chair',
  user: {
    first_name: 'Mick',
    last_name: 'Broadstone',
    address: {
      city: 'Austin',
      state: 'TX',
      zip: '78704'
    }
  }
});