2017-01-27 7 views
1

Я определил мои модели так же, как в следующем примере из документации: 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

На самом деле это была ошибка в Sequelize. Я создал запрос на перенос, поэтому приведенный выше код должен работать со следующей версией Sequelize. https://github.com/sequelize/sequelize/pull/7181

+0

Я столкнулся с той же проблемой, что и полиморфные отношения 1: m с одним вызовом «создать» на основе сообщений Post -> Comment/Image -> Comment. Вы испытывали то же самое? – GitCarter

 Смежные вопросы

  • Нет связанных вопросов^_^