Обратный полиморфизм с экто

текущая документация Ecto http://hexdocs.pm/ecto/Ecto.Schema.html только объясняет, как построить belongs_to тип полиморфной ассоциации, когда полиморфный Comment может принадлежать как Task, так и Post. Но как насчет противоположного направления?

Например, есть Listing, который может иметь один из четырех типов свойств: Room, Apartment, Vila или Office.

Рассмотрение взаимно-однозначного отношения в приведенном выше примере будет означать, что должны быть rooms_listings, apartments_listings, vila_listings и office_listings, что невозможно, потому что это приведет к дублированию всех других таблиц, связанных с listings.

Вопрос в том, как моделировать такие отношения?


person lessless    schedule 17.10.2015    source источник


Ответы (1)


Я думаю, что самый простой способ смоделировать это - перевернуть стороны ассоциации, а затем просто добавить поля room_id и т. Д. В таблицу listings:

defmodule Listing do
  use Ecto.Model
  schema "listings" do
    belongs_to :room, Room
    belongs_to :apartment, Apartment
    belongs_to :villa, Villa
    belongs_to :office, Office
  end
end

Затем вы можете определить отношение has_one :listing для каждой из других таблиц:

defmodule Room do
  use Ecto.Model
  schema "rooms" do
    has_one :listing, Listing
  end
end

defmodule Apartment do
  use Ecto.Model
  schema "apartments" do
    has_one :listing, Listing
  end
end

defmodule Villa do
  use Ecto.Model
  schema "villas" do
    has_one :listing, Listing
  end
end

defmodule Office do
  use Ecto.Model
  schema "offices" do
    has_one :listing, Listing
  end
end
person Patrick Oscity    schedule 17.10.2015
comment
Патрик, а что, если теоретически будет 20 типов недвижимости? Что тогда? - person lessless; 17.10.2015
comment
@lessless взгляните на этот связанный ответ, он подробно описывает дизайн с использованием конкретной надтаблицы, которая устраняет необходимость в дополнительном столбце для каждого типа недвижимости, а также гарантирует, что вы можете использовать ограничения внешнего ключа для обеспечения ссылочной целостности: stackoverflow.com/questions/922184/ - person Patrick Oscity; 17.10.2015
comment
@lessless также стоит отметить, что использование 20 типов все равно будет быстрее, займет меньше места (потому что большинство из них будет равно нулю) и поддержит целостность базы данных, в то время как предложенный полиморфный подход все равно не будет. - person José Valim; 20.10.2015
comment
@ JoséValim, о каком именно подходе вы говорите? Тот, который упоминается в документации, или тот, у которого есть надтаблица? - person lessless; 20.10.2015
comment
Я отвечал на ваши вопросы: Патрик, а что, если теоретически будет 20 типов недвижимости? Что тогда? :) - person José Valim; 22.10.2015
comment
@lessless Я думаю, что он сравнил подход, использующий явные столбцы, с полиморфными дизайнами в целом, будь то надтаблицы или полиморфные ассоциации, как описано в ecto docs. - person Patrick Oscity; 22.10.2015
comment
спасибо, ребята! Я действительно вдохновлен начать проект с Phoenix не потому, что это сделает меня лучшим разработчиком, но также надеюсь создать несколько рабочих мест, связанных с эликсиром в ближайшем будущем. - person lessless; 22.10.2015