Вопрос

(извините за плохой английский)

Предположим, у меня есть модели 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?Я пробовал несколькими способами, но безуспешно.

Это было полезно?

Решение

Имеют ли каждый объект A, B и C один адрес? Или много адресов? Судя по вашему комментарию ниже, каждый объект имеет один адрес.

Если каждый объект имеет только один адрес, вы можете просто поместить внешний ключ в объекты A/B/C с идентификатором адреса.Пусть объекты «Дом» или «Офис» имеют один адрес:

class House < ActiveRecord::Base
  belongs_to :address
end

class Office < ActiveRecord::Base
  belongs_to :address
end

Твой officeпесок houses Таблицы БД необходимо иметь внешний ключ Address_id.Таким образом, вы можете получить доступ к адресу объекта с помощью чего-то вроде house.address или office.address.

Если эти объекты могут иметь много адресов, решение зависит от объектов A/B/C.Если они связаны, вы можете использовать наследование одной таблицы – Rails хорошо поддерживает этот шаблон. - но без дополнительной информации трудно сказать, какой подход является лучшим.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top