(извините за плохой английский)
Предположим, у меня есть модели A, B, C. У каждой модели один адрес.
В книге «Антипаттерны SQL: как избежать ловушек программирования баз данных» (глава 7 - Полиморфные ассоциации) есть рецепт, позволяющий избежать таких ассоциаций с помощью «общей супертаблицы» (также называемой базовой таблицей или таблицей предков).
Полиморфно это было бы:
table addresses:
id: integer
parent_type:string # 'A', 'B' or 'C'
parent_id: integer
Я знаю, что вы можете использовать таблицы пересечений, но следующее решение выглядит более совершенным:
Вместо того, чтобы полиморфно связывать A, B, C с Address, рецепт предлагает создать супертаблицу (Addressing), в которой будет только поле id (суррогатный ключ или псевдоключ). Затем другие таблицы ссылаются на адресацию. Таким образом, по словам автора, «вы можете рассчитывать на обеспечение целостности данных вашей базы данных с помощью внешних ключей». Итак, это будет:
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? Я пробовал несколькими способами, но безуспешно.