(извините за плохой английский)
Предположим, у меня есть модели A, B, C. У каждой модели есть один адрес.
В книге "Антипаттерны SQL: предотвращение ловушекПрограммирование базы данных "(глава 7 - Полиморфные ассоциации) Существует рецепт, позволяющий избежать таких ассоциаций с помощью" общей супер таблицы "(также называемой базовой таблицей или таблицей предков).
Полиморфно это будет:
table addresses:
id: integer
parent_type:string # 'A', 'B' or 'C'
parent_id: integer
Я знаю, что вы можете использовать таблицы пересечений, но следующее решение выглядит более отточенным:
Вместо полиморфного связывания A, B, C с Address, рецепт предлагает создать супертаблица (адресация), которая имеет только поле идентификатора (суррогатный ключ или псевдоключ).Затем другие таблицы ссылаются на адресацию.Таким образом, говорит автор, «вы можете положиться на обеспечение целостности данных вашей базы данных с помощью внешних ключей».Итак, это будет:
table addressing
id: integer
table addresses
id: integer
addressing_id: integer (foreign_key)
zip: string
table a
id: integer
addressing_id: integer (foreign_key)
name: string
table b
id: integer
addressing_id: integer (foreign_key)
name: string
table c
id: integer
addressing_id: integer (foreign_key)
name: string
Запрос SQL будет выглядеть так:
SELECT * from a
JOIN address USING addressing_id
WHERE a.addressing_id = 1243
ВОПРОС: как кодировать такой сценарий в Rails?Я пытался несколькими способами без успеха.