(извините за любой плохой английский)избежать полиморфных ассоциаций в Rails
Давайте предположим, что у меня есть модели A, B, C. Каждая модель имеет один адрес.
В книге «Антипаттеры SQL: устранение ошибок программирования баз данных» (глава 7 - Полиморфные ассоциации) существует рецепт, позволяющий избежать таких ассоциаций с помощью «общей таблицы супер» (также называемой базовой таблицей или таблица предков).
полиморфна, было бы:
table addresses:
id: integer
parent_type:string # 'A', 'B' or 'C'
parent_id: integer
Я знаю, что вы можете использовать таблицы пересечений, но следующее решение выглядит более полированным:
Вместо того, полиморфна связывающей A, B, C с адресом, то рецепт предлагает создать супер-таблицу (Адресация), которая имеет только поле 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? Я пробовал несколько способов без успеха.
Вы можете посмотреть руководство RoR об ассоциациях [1], возможно, вы могли бы найти способ сделать это с помощью опции: через, извините, но я не могу попробовать в этот момент. [1]: http://guides.rubyonrails.org/association_basics.html#the-has_one-through-association –