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

Commit d579cef6 by Jan Aagaard Meier

Allow self association without junction table by specifying isManyMany: false in options

1 parent a2a07c2e
...@@ -9,6 +9,7 @@ module.exports = (function() { ...@@ -9,6 +9,7 @@ module.exports = (function() {
this.source = srcDAO this.source = srcDAO
this.target = targetDAO this.target = targetDAO
this.options = options this.options = options
this.isManyMany = this.options.isManyMany === undefined ? true : this.options.isManyMany
this.isSelfAssociation = (this.source.tableName == this.target.tableName) this.isSelfAssociation = (this.source.tableName == this.target.tableName)
this.associationAccessor = this.combinedName = this.options.joinTableName || Utils.combineTableNames( this.associationAccessor = this.combinedName = this.options.joinTableName || Utils.combineTableNames(
...@@ -34,7 +35,7 @@ module.exports = (function() { ...@@ -34,7 +35,7 @@ module.exports = (function() {
// is there already a single sided association between the source and the target? // is there already a single sided association between the source and the target?
// or is the association on the model itself? // or is the association on the model itself?
if (this.isSelfAssociation || multiAssociation) { if ((this.isSelfAssociation && this.isManyMany) || multiAssociation) {
// remove the obsolete association identifier from the source // remove the obsolete association identifier from the source
if(this.isSelfAssociation) { if(this.isSelfAssociation) {
this.foreignIdentifier = Utils._.underscoredIf((this.options.as || this.target.tableName) + 'Id', this.options.underscored) this.foreignIdentifier = Utils._.underscoredIf((this.options.as || this.target.tableName) + 'Id', this.options.underscored)
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
"generic-pool": "1.0.9" "generic-pool": "1.0.9"
}, },
"devDependencies": { "devDependencies": {
"jasmine-node": "1.0.22", "jasmine-node": "1.0.17",
"sqlite3": ">=2.0.0", "sqlite3": ">=2.0.0",
"pg": "0.6.x", "pg": "0.6.x",
"buster": "0.5.1" "buster": "0.5.1"
......
...@@ -93,6 +93,67 @@ describe('HasMany', function() { ...@@ -93,6 +93,67 @@ describe('HasMany', function() {
}) })
}) })
it("should allow selfAssociation to be single linked (only one DAO is created)", function() {
var oldLength = sequelize.daoFactoryManager.daos.length;
var Comment = sequelize.define('Comment', { content: Sequelize.STRING })
Comment.belongsTo(Comment, {as: "Parent"});
Comment.hasMany(Comment, {as: 'Children', foreignKey: "ParentId", isManyMany: false})
expect(sequelize.daoFactoryManager.daos.length).toEqual(oldLength + 1)
Helpers.async(function(done) {
Comment.sync({force: true}).success(function() {
done()
})
})
Helpers.async(function(done) {
Comment.create({ content: 'parentComment' }).success(function(p) {
parent = p
done()
})
})
Helpers.async(function(done) {
Comment.create({ content: 'child1' }).success(function(child1) {
Comment.find({where: { content: 'parentComment' }}).success(function(parent) {
child1.setParent(parent).success(function() {
done()
})
})
})
})
Helpers.async(function(done) {
Comment.create({ content: 'child2' }).success(function(child2) {
child2.setParent(parent).success(function() {
done()
})
})
})
Helpers.async(function(done) {
Comment.find({where: { content: 'parentComment' }}).success(function(parent) {
parent.getChildren().success(function(children) {
expect(children.length).toEqual(2)
done()
})
})
})
})
it("should still use many to many for selfAssociation by default (two DAOs are created)", function() {
Helpers.async(function(done) {
var oldLength = sequelize.daoFactoryManager.daos.length;
var Comment = sequelize.define('Comment', { content: Sequelize.STRING })
Comment.belongsTo(Comment, {as: "Parent"})
Comment.hasMany(Comment, {as: 'Children'})
expect(sequelize.daoFactoryManager.daos.length).toEqual(oldLength + 2)
done();
})
})
}) })
describe('bi-directional', function() { describe('bi-directional', function() {
......
...@@ -19,6 +19,7 @@ module.exports = { ...@@ -19,6 +19,7 @@ module.exports = {
postgres: { postgres: {
database: 'sequelize_test', database: 'sequelize_test',
username: "postgres", username: "postgres",
password: 'abc',
port: 5432 port: 5432
} }
} }
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!