С полиморфными ассоциациями может быть сложно работать, если вы никогда не делали их раньше, и их может быть сложно реализовать в sequelize, поскольку еще не реализованы методы sequelize, такие как belongsToManyPolymorphic. В настоящее время лучшим результатом Google для продолжения полиморфных ассоциаций является проблема github, открытая в 2014 году, в которой кратко упоминается возможность использования областей видимости для реализации полиморфных ассоциаций, но не рассматриваются детали реализации. Давайте рассмотрим один из способов реализации полиморфной ассоциации N: M (многие-ко-многим), которая позволяет нам легко добавлять / удалять ассоциации, а также позволяет нам использовать методы модели Sequelize вместо того, чтобы писать свои собственные методы для каждой ассоциации. мы добавляем. Предположим, у нас есть приложение, которое полагается на то, что пользователи помечают новости, а затем отображают их по категориям. До сих пор нам удавалось обойтись обычными отношениями N: M с таблицей соединений, соединяющей нашу story таблицу с нашей tag таблицей. Наш код может выглядеть примерно так:

В приведенном выше примере будет создана таблица story_tag со столбцом tag_id и столбцом story_id. Чтобы перейти от этого к схеме, которая позволяет нам связывать теги с любой таблицей, скажем Users, нам нужно будет использовать что-то более * полиморфное *. Давайте определим tag_link таблицу.

Эта новая таблица должна выглядеть довольно просто. В конечном итоге у него будет столбец tag_id, как только мы свяжем его с нашей моделью Tag, и его можно будет использовать для связывания тега с любой другой таблицей. Однако то, что мы * действительно * хотим, - это способ использовать getTags и все другие удобные вспомогательные методы Sequelize в любой модели, которую мы связываем с тегами. Давайте определим associate метод на Tag, который позволит нам это сделать.

Наш index.js файл нужно будет изменить, чтобы он выглядел так:

Теперь Story и User связаны с Tag и имеют такие методы, как addTag и getTags! Это не только удобно, но и позволяет избежать нескольких таблиц соединения, таких как story_tag, tag_user и т. Д. Более того, все, что нам нужно сделать, если мы хотим связать с Tag больше таблиц, - это добавить их в массив, который мы передаем в Associate!

И последнее замечание: имя вашей области должно соответствовать имени вашего вторичного столбца в tag_link (в нашем случае table). Не стесняйтесь задавать мне любые вопросы в твиттере или оставляйте их в комментариях ниже.