Polymorphi c ассоциация с идентификатором и типом в отдельных таблицах - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть отношение полиморф c в моем приложении для настраиваемых полей, подобных этому:

class CustomFieldValue < ApplicationRecord
  belongs_to :custom_field_type
  belongs_to :custom_field_valuable, polymorphic: true
end
class CustomFieldType < ApplicationRecord
  has_many :custom_field_values
end

В основном таблица custom_field_type содержит несколько подробностей о типе поля (выбор, флажок и т. Д. c), а также столбец «model_type» для модели, к которой принадлежит настраиваемое поле.

Таблица custom_field_value содержит ожидаемые полиморфы c столбцы «custom_field_valuable_type» и «custom_field_valuable_id», которые работают нормально, но видят так как custom_field_value принадлежит custom_field_type, в котором уже хранится model_type, мне было интересно, есть ли способ избавиться от custom_field_valuable_type?

Я пытался переопределить «custom_field_valuable_type» с помощью

def custom_field_valuabkle_type
  self.custom_field_type.model_type
end

Но это не работает, так как нет столбца для запроса.

1 Ответ

1 голос
/ 17 февраля 2020

Мне было интересно, есть ли способ избавиться от custom_field_valuable_type?

No. Polymorphi c ассоциации ожидают association_name_type столбец, существующий в таблице с ассоциацией. Поместить столбец типа в другую таблицу невозможно, AFAIK, и это будет слишком сложно. Ассоциации Polymorphi c уже являются хакерским решением проблемы несоответствия объектно-реляционного импеданса, и вы собираетесь сказать, что внешний ключ состоит из двух столбцов, а внешний ключ состоит из столбцов в разных таблицах! Это ничего не улучшает, а только увеличивает несоответствие. Ваш подход не сработает, так как запросы на соединение выполняются в базе данных и не вызывают ваш метод получения.

Я думаю, вы также путаете две совершенно разные концепции. То, что вы делаете, - это просто вариация в паттерне значения атрибута сущности (EAV). То, что ваш CustomFieldType предоставляет для настройки, - это нормализация атрибутов, чтобы вы не дублировали определение атрибутов для каждого значения. Это не имеет никакого отношения к связыванию Value -> Entity.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...