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

Commit 2a1e5064 by pola88 Committed by Sushant

fix(belongs-to-many): support for polymorphic associations with scopes (#7533)

1 parent 6d19ea29
...@@ -511,7 +511,7 @@ class BelongsToMany extends Association { ...@@ -511,7 +511,7 @@ class BelongsToMany extends Association {
const targetKey = association.target.primaryKeyAttribute; const targetKey = association.target.primaryKeyAttribute;
const identifier = association.identifier; const identifier = association.identifier;
const foreignIdentifier = association.foreignIdentifier; const foreignIdentifier = association.foreignIdentifier;
const where = {}; let where = {};
if (newAssociatedObjects === null) { if (newAssociatedObjects === null) {
newAssociatedObjects = []; newAssociatedObjects = [];
...@@ -520,7 +520,7 @@ class BelongsToMany extends Association { ...@@ -520,7 +520,7 @@ class BelongsToMany extends Association {
} }
where[identifier] = sourceInstance.get(sourceKey); where[identifier] = sourceInstance.get(sourceKey);
_.assign(where, association.through.scope); where = Object.assign(where, association.through.scope);
return association.through.model.findAll(_.defaults({where, raw: true}, options)).then(currentRows => { return association.through.model.findAll(_.defaults({where, raw: true}, options)).then(currentRows => {
const obsoleteAssociations = []; const obsoleteAssociations = [];
...@@ -559,10 +559,10 @@ class BelongsToMany extends Association { ...@@ -559,10 +559,10 @@ class BelongsToMany extends Association {
} }
if (obsoleteAssociations.length > 0) { if (obsoleteAssociations.length > 0) {
const where = {}; let where = {};
where[identifier] = sourceInstance.get(sourceKey); where[identifier] = sourceInstance.get(sourceKey);
where[foreignIdentifier] = obsoleteAssociations.map(obsoleteAssociation => obsoleteAssociation[foreignIdentifier]); where[foreignIdentifier] = obsoleteAssociations.map(obsoleteAssociation => obsoleteAssociation[foreignIdentifier]);
where = Object.assign(where, association.through.scope);
promises.push(association.through.model.destroy(_.defaults({where}, options))); promises.push(association.through.model.destroy(_.defaults({where}, options)));
} }
...@@ -576,6 +576,7 @@ class BelongsToMany extends Association { ...@@ -576,6 +576,7 @@ class BelongsToMany extends Association {
attributes = _.defaults(attributes, unassociatedObject[association.through.model.name], defaultAttributes); attributes = _.defaults(attributes, unassociatedObject[association.through.model.name], defaultAttributes);
_.assign(attributes, association.through.scope); _.assign(attributes, association.through.scope);
attributes = Object.assign(attributes, association.through.scope);
return attributes; return attributes;
}); });
......
...@@ -617,6 +617,62 @@ describe(Support.getTestDialectTeaser('BelongsToMany'), () => { ...@@ -617,6 +617,62 @@ describe(Support.getTestDialectTeaser('BelongsToMany'), () => {
}); });
it('using scope to set associations', function() { it('using scope to set associations', function() {
const self = this;
const ItemTag = self.sequelize.define('ItemTag', {
id : { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
tag_id: { type: DataTypes.INTEGER, unique: false },
taggable: { type: DataTypes.STRING },
taggable_id: { type: DataTypes.INTEGER, unique: false }
}),
Tag = self.sequelize.define('Tag', {
id : { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
name: DataTypes.STRING
}),
Comment = self.sequelize.define('Comment', {
id : { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
name: DataTypes.STRING
}),
Post = self.sequelize.define('Post', {
id : { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
name: DataTypes.STRING
});
Post.belongsToMany(Tag, {
through: { model: ItemTag, unique: false, scope: { taggable: 'post' } },
foreignKey: 'taggable_id'
});
Comment.belongsToMany(Tag, {
through: { model: ItemTag, unique: false, scope: { taggable: 'comment' } },
foreignKey: 'taggable_id'
});
return self.sequelize.sync({ force: true }).then(() => {
return Promise.all([
Post.create({ name: 'post1' }),
Comment.create({ name: 'comment1' }),
Tag.create({ name: 'tag1' })
]);
}).bind({}).spread( (post, comment, tag) => {
self.post = post;
self.comment = comment;
self.tag = tag;
return self.post.setTags([self.tag]);
}).then( () => {
return self.comment.setTags([self.tag]);
}).then( () => {
return Promise.all([
self.post.getTags(),
self.comment.getTags()
]);
}).spread( (postTags, commentTags) => {
expect(postTags).to.have.length(1);
expect(commentTags).to.have.length(1);
});
});
it('updating association via set associations with scope', function() {
const self = this;
const ItemTag = this.sequelize.define('ItemTag', { const ItemTag = this.sequelize.define('ItemTag', {
id : { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true }, id : { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
tag_id: { type: DataTypes.INTEGER, unique: false }, tag_id: { type: DataTypes.INTEGER, unique: false },
...@@ -646,23 +702,31 @@ describe(Support.getTestDialectTeaser('BelongsToMany'), () => { ...@@ -646,23 +702,31 @@ describe(Support.getTestDialectTeaser('BelongsToMany'), () => {
foreignKey: 'taggable_id' foreignKey: 'taggable_id'
}); });
return this.sequelize.sync({ force: true }).then(() => { return this.sequelize.sync({ force: true }).then( () => {
return Promise.all([ return Promise.all([
Post.create({ name: 'post1' }), Post.create({ name: 'post1' }),
Comment.create({ name: 'comment1' }), Comment.create({ name: 'comment1' }),
Tag.create({ name: 'tag1' }) Tag.create({ name: 'tag1' }),
Tag.create({ name: 'tag2' })
]); ]);
}).bind({}).spread(function(post, comment, tag) { }).bind({}).spread( (post, comment, tag, secondTag) => {
this.post = post; self.post = post;
this.comment = comment; self.comment = comment;
this.tag = tag; self.tag = tag;
return this.post.setTags([this.tag]); self.secondTag = secondTag;
}).then(function() { return self.post.setTags([self.tag, self.secondTag]);
return this.comment.setTags([this.tag]); }).then( () => {
}).then(function() { return self.comment.setTags([self.tag, self.secondTag]);
return this.comment.getTags(); }).then( () => {
}).then(_tags => { return self.post.setTags([self.tag]);
expect(_tags).to.have.length(1); }).then( () => {
return Promise.all([
self.post.getTags(),
self.comment.getTags()
]);
}).spread( (postTags, commentTags) => {
expect(postTags).to.have.length(1);
expect(commentTags).to.have.length(2);
}); });
}); });
}); });
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!