不要怂,就是干,撸起袖子干!

Commit af848776 by Mick Hansen

add support for simple nested belongsTo -> hasMany include

1 parent e0804c74
......@@ -220,7 +220,7 @@ module.exports = (function() {
// Queries with include
} else if (this.options.hasJoin === true) {
results = groupJoinData(results, this.options)
//console.log(JSON.stringify(results, null, '\t'));
console.log(JSON.stringify(results, null, '\t'));
result = results.map(function(result) {
return this.callee.build(result, {
isNewRecord: false,
......@@ -328,7 +328,10 @@ module.exports = (function() {
calleeData = _.omit(row, options.includeNames)
existingResult = _.find(results, function (result) {
return Utils._.isEqual(_.omit(result, options.includeNames), calleeData)
if (options.includeNames) {
return Utils._.isEqual(_.omit(result, options.includeNames.concat(['__children'])), calleeData)
}
return Utils._.isEqual(result, calleeData)
})
if (!existingResult) {
......@@ -337,22 +340,22 @@ module.exports = (function() {
for (var attrName in row) {
if (row.hasOwnProperty(attrName)) {
child = Object(row[attrName]) === row[attrName] && options.includeMap[attrName]
child = Object(row[attrName]) === row[attrName] && options.includeMap && options.includeMap[attrName]
if (child) {
existingResult[attrName] = existingResult[attrName] || []
var attrRowExists = existingResult[attrName].some(function(attrRow) {
return Utils._.isEqual(attrRow, row[attrName])
})
if (!attrRowExists) {
if (child.include) {
existingResult[attrName].push(groupJoinData([row[attrName]], child)[0])
} else {
existingResult[attrName].push(row[attrName])
}
}
if (!existingResult.__children) existingResult.__children = {}
if (!existingResult.__children[attrName]) existingResult.__children[attrName] = [];
existingResult.__children[attrName].push(row[attrName])
}
}
}
}
})
results.forEach(function (result) {
_.each(result.__children, function (children, key) {
result[key] = groupJoinData(children, options.includeMap[key])
})
delete result.__children
})
return results
}
......
......@@ -142,10 +142,8 @@ module.exports = (function() {
this.callee[key] = record
}
}
this.emit('success', this.callee)
} else {
this.emit('success', rows)
}
}
this.emit('success', this.callee)
} else if (this.send('isUpdateQuery')) {
if(this.callee !== null) { // may happen for bulk updates
for (var key in rows[0]) {
......
......@@ -89,7 +89,7 @@ module.exports = (function() {
}
var onSuccess = function(results, metaData) {
var result = this.callee || results
var result = this.callee
// add the inserted row id to the instance
if (this.send('isInsertQuery', results, metaData)) {
......
......@@ -161,7 +161,61 @@ describe(Support.getTestDialectTeaser("Include"), function () {
user.tasks.forEach(function (task) {
expect(task.project).to.be.ok
})
done()
})
})
})
})
it('should support a simple nested belongsTo -> hasMany include', function (done) {
var Task = this.sequelize.define('Task', {})
, Worker = this.sequelize.define('Worker', {})
, Project = this.sequelize.define('Project', {})
Worker.belongsTo(Project)
Project.hasMany(Task)
this.sequelize.sync({force: true}).done(function () {
async.auto({
worker: function (callback) {
Worker.create().done(callback)
},
project: function (callback) {
Project.create().done(callback)
},
tasks: function(callback) {
Task.bulkCreate([
{},
{},
{},
{}
]).done(function () {
Task.findAll().done(callback)
})
},
projectTasks: ['project', 'tasks', function (callback, results) {
results.project.setTasks(results.tasks).done(callback)
}],
projectWorker: ['project', 'worker', function (callback, results) {
results.worker.setProject(results.project).done(callback)
}]
}, function (err, results) {
Worker.find({
where: {
id: results.worker.id
},
include: [
{model: Project, include: [
{model: Task}
]}
]
}).done(function (err, worker) {
expect(err).not.to.be.ok
expect(worker.project).to.be.ok
expect(worker.project.tasks).to.be.ok
expect(worker.project.tasks.length).to.equal(4)
done()
})
})
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!