Rails has_many: сквозные полиморфные отношения не работают

У меня есть следующие три модели:

Мероприятие:

class Event < ApplicationRecord
  has_many :taggings, as: :taggable, dependent: :destroy
  has_many :tags, through: :taggings
end

events table:

Column   |  Type    |                     Modifiers
---------+----------+----------------------------------------------------
id       | bigint   | not null
title | string | not null
content | text | not null

Ярлык:

class Tag < ApplicationRecord
  has_many :taggings, dependent: :destory
  has_many :events, through: :taggings, source: :taggable, source_type: 'Event'
end

tags table:

Column   |  Type    |                     Modifiers
---------+----------+----------------------------------------------------
id       | bigint   | not null
name | string | not null

Пометка:

class Tagging < ApplicationRecord
  belongs_to :taggable, polymorphic: true
  belongs_to :tags
end

taggings table:

Column   |  Type    |                     Modifiers
---------+----------+----------------------------------------------------
id       | bigint   | not null
taggable_id | integer | not null
taggable_type | string | not null
tag_id | integer | not null | FK_INDEX

Теперь проблема в том, что я не могу использовать какие-либо из этих отношений и получаю ошибки, указывающие на отсутствие ассоциаций.

event = Event.find(x)
event.tags

Error: 
NameError: uninitialized constant Event::Tags

event.taggable

Error:
NoMethodError: undefined method `taggable' for #<Event>

Я не могу понять, правильно ли настроены мои ассоциации или мой вариант использования неверен?

Как добавить ассоциацию через режим? Как мне запрашивать теги через модель событий?

Я думаю, что в Tagging вам может понадобиться belongs_to :tag (единственное число)

mr rogers 04.04.2022 20:13

@mrrogers, ты прав, но немного осторожен. Название ассоциаций belongs_to и has_one должно быть в единственном числе.

max 05.04.2022 21:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
22
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это простая ошибка множественного числа:

class Tagging < ApplicationRecord
  belongs_to :taggable, polymorphic: true
  belongs_to :tag
end

Имена ассоциаций belongs_to и has_one должны быть в единственном числе.

Если вы посмотрите на сообщение об ошибке NameError: uninitialized constant Event::Tags, вы увидите, что он ищет Tags, а не Tag.

Другие вопросы по теме