С полиморфными ассоциациями может быть сложно работать, если вы никогда не делали их раньше, и их может быть сложно реализовать в 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
). Не стесняйтесь задавать мне любые вопросы в твиттере или оставляйте их в комментариях ниже.