2017-02-17 1 views
0

Я имею эту иерархическую структуру: Person < has a > Team < has a > DepartmentПолучить Свести JSON из различных Sails.js моделей ассоциаций

, и я хочу, чтобы извлечь расплющить запись от человека, как это:

{ 
    "name": "Foo", 
    "id": 1, 
    ... 
    "team": { 
    "name": "MGMT", 
    "id": 1, 
    "department": 1 
    ... 
    }, 
    "department": { 
    "name": "Top", 
    "id": 1, 
    "office": 1 
    ... 
    } 
} 

Они являются модели:

PERSON

// A person that belongs to a team 
module.exports = { 

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

    //Assosiations  
    team: { 
     model: 'team' 
    }, 
    department: { 
     model: 'department', 
     via: 'team.department' 
    }, 
    } 
}; 

КОМАНДА

// A team with many persons and belongs to one department 
module.exports = { 

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

    //Associations 
    department: { 
     model: 'department' 
    }, 

    members: { 
     collection: 'person', 
     via: 'team' 
    } 
    } 
}; 

ОТДЕЛ

// A department that has many teams 
module.exports = { 

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

    teams: { 
     collection: 'team', 
     via: 'department' 
    } 
    } 
}; 

Я не могу это сделать, как это (да, он имеет больше уровней):

function (req, res) { 

     Person.findById(1).exec(function (err, people) { 
      Team.findById(people[0].team).exec(function (err, teams) { 
       Department.findById(teams[0].department).exec(function (err, departments) { 
        Office.findById(departments[0].office).exec(function (err, offices) { 
         Company.findById(offices[0].company).exec(function (err, companies) { 

          var composeRecord = Object.assign(
           people[0], { 
            team: teams[0], 
            department: departments[0], 
            office: offices[0], 
            company: companies[0], 
           }); 

          res.send(composeRecord); 

         }) 
        }) 
       }) 
      }) 
     }) 
    } 

Любые идеи, как сделать это лучше?

+0

Напишите запрос к базе данных и использовать [ '.query'] (http://sailsjs.com/documentation/reference/waterline-orm/models/query) – Sangharsh

ответ

0

Если вы используете Mongo, вы можете сделать это, используя обещания. Это будет выглядеть намного лучше

var composeRecord 
Person.findById(1).then(function(people){ 
    composeRecord = people[0] 
    return Team.findById(people[0].team) 
}).then(function (teams) { 
    composeRecord.team = teams[0] 
    return Department.findById(teams[0].department) 
}).then(function(departments){ 
    composeRecord.department = departments[0] 
    return Office.findById(departments[0].office) 
}).then(function(offices){ 
    composeRecord.office = offices[0] 
    return Company.findById(offices[0].company) 
}).then(function(companies){ 
    composeRecord.company = companies[0] 
    res.json(composeRecord) 
}).catch(function (err) { 
    console.log(err) 
}) 

Если вы используете reletional дб, как MySQL о PG вы должны писать query

+0

Спасибо, используя обещания, также работает с MySQL. –

+0

@FilipeMoraisJorge работает, но будет работать быстрее, если вы напишете запрос с помощью соединений. – Bonanza

+0

Итак, я выбираю между Агностиком и БД или более быстрым исполнением. Еще раз спасибо. –