Я определил мои модели так же, как в следующем примере из документации: http://docs.sequelizejs.com/en/latest/docs/associations/#nmСоздание модели и ее полиморфных ассоциаций в одном «создать» вызов с использованием Sequelize.js
Когда я пытаюсь создать сообщение и его Теги за один проход, используя метод Post.create
, получают сообщение, теги и строку «сквозной» таблицы, за исключением того, что поле taggable
не устанавливается в таблице «через», поэтому ассоциация не получается правильно определены.
Если я создаю как тег и пост отдельно, то я могу использовать метод post.addTags
связать тег и в этом случае все работает отлично и taggable
поля получает значение, как определенно в рамках Post.belongsToMany
ассоциации.
Мой вопрос: я не передаю правильные параметры методу Post.create
или использует таблицу «через» с областью действия для создания ассоциаций за один раз, не поддерживаемый Sequelize?
Вот код создания:
models.Post.create({
title: 'test',
tags: [{
name: 'tag1'
}]
}, {
include: [{
model: models.Tag,
as: 'tags',
through: {
model: models.ItemTag,
scope: {
taggable: 'post'
}
}
}]
});
Вот сгенерированный SQL:
Executing (default): INSERT INTO `posts` (`id`,`title`,`created_at`,`updated_at`) VALUES (DEFAULT,'test','2017-01-27 16:29:15','2017-01-27 16:29:15');
Executing (default): INSERT INTO `tags` (`id`,`name`,`created_at`,`updated_at`) VALUES (DEFAULT,'tag1','2017-01-27 16:29:15','2017-01-27 16:29:15');
Executing (default): INSERT INTO `item_tag` (`tag_id`,`taggable_id`,`created_at`,`updated_at`) VALUES (1,1,'2017-01-27 16:29:15','2017-01-27 16:29:15');
А вот мои модели определения:
// Post
export
default
function(sequelize, DataTypes) {
var Post = sequelize.define('Post', {
title: DataTypes.STRING
}, {
classMethods: {
associate: function(models) {
Post.belongsToMany(models.Tag, {
as: 'tags',
foreignKey: 'taggable_id',
constraints: false,
through: {
model: models.ItemTag,
unique: false,
scope: {
taggable: 'post'
}
}
});
}
},
tableName: 'posts',
underscored: true
});
return Post;
};
// Tag
export
default
function(sequelize, DataTypes) {
var Tag = sequelize.define('Tag', {
name: DataTypes.STRING,
}, {
classMethods: {
associate: function(models) {
Tag.belongsToMany(models.Post, {
as: 'posts',
foreignKey: 'tag_id',
constraints: false,
through: {
model: models.ItemTag,
unique: false,
scope: {
taggable: 'posts'
}
}
});
}
},
tableName: 'tags',
underscored: true
});
return Tag;
};
// ItemTag (the "through" table)
export
default
function(sequelize, DataTypes) {
var ItemTag = sequelize.define('ItemTag', {
tag_id: {
type: DataTypes.INTEGER,
unique: 'item_tag',
references: {
model: 'tags',
key: 'id'
}
},
taggable_id: {
type: DataTypes.INTEGER,
unique: 'item_tag'
},
taggable: {
type: DataTypes.STRING,
unique: 'item_tag'
},
}, {
classMethods: {
associate: function(models) {
ItemTag.belongsTo(models.Post, {
foreignKey: 'taggable_id',
constraints: false,
scope: {
taggable: 'post'
}
});
ItemTag.belongsTo(models.Tag, {
foreignKey: 'tag_id',
constraints: false
});
}
},
tableName: 'item_tag',
underscored: true
});
return ItemTag;
};
Я столкнулся с той же проблемой, что и полиморфные отношения 1: m с одним вызовом «создать» на основе сообщений Post -> Comment/Image -> Comment. Вы испытывали то же самое? – GitCarter