Aha! Оказывается, я неправильно настраивал ассоциации has_many
. Параметр as: :taggable
должен быть помещен в таблицу соединений.
Он должен иметь следующий вид:
image.rb
has_many :image_tags, as: :taggable
has_many :tags, through: :image_tags
tag.rb
has_many :image_tags, as: :taggable
has_many :images, through: :image_tags
Возможно, мне еще понадобится указать опции source
и source_type
позже, но это исправление вернулось в драку!
ОБНОВЛЕНИЕ 20200317:
Хорошо, теперь я чувствую, что теперь понимаю ситуацию немного лучше. Использование полиморфа c со сквозным столом немного теряет свой блеск, потому что каждый из связанных методов должен быть настроен индивидуально. И здесь вступают в игру опции source
и source_type
.
Итак, с учетом вышеизложенного, если я хочу позволить пользователю звонить image.tags
, мне нужно дать модели больше информация, чтобы он знал, что на самом деле означает .tags
. Это выглядит примерно так:
has_many :tags, through: :taggable, source_type: 'Tag'
Что все хорошо, но что если пользователь захочет вызвать ВСЕ различные типы теговых таблиц за один раз? 1046 *? На данный момент, я не знаю, возможно ли это. Может быть, вы могли бы «прочитать» уникальные значения, присутствующие в столбце, а затем вызывать их по очереди, как-нибудь?
- ИЛИ! -
Может быть, вы обойдете метод запроса activerecord в целом и просто root через таблицу соединений с SQL запросами? Это может быть лучшим подходом ...
Но сейчас это может быть неуместным ... Единственный способ, которым я знаю, чтобы сделать это в настоящее время, это настроить пользовательские методы запросов для каждого типа. Таким образом, вы получите что-то вроде
has_many :people, through: :taggable, source_type: 'Person'
has_many :businesses, through: :taggable, source_type: 'Business'
И затем вам придется вызывать их по отдельности, а затем объединять в один гигантский массив, похожий на структуру.