Похоже, что рекомендуемый способ обработки полиморфных ассоциаций в Phoenix - это добавление промежуточной схемы, содержащей ссылки на другие схемы:
Итак, если бы я хотел создать схемы с разными видами животных, я бы сделал:
defmodule Animal do
use Ecto.Model
schema "animals" do
belongs_to(:dog, Dog)
belongs_to(:cat, Cat)
belongs_to(:owner, PetOwner)
end
end
defmodule Dog do
use Ecto.Model
schema "dogs" do
end
end
defmodule Cat do
use Ecto.Model
schema "cats" do
end
end
defmodule PetOwner do
use Ecto.Model
schema "pet_owners" do
has_one(:pet, Animal)
end
end
Но у меня также могут быть схемы PetOwner
, содержащие двоичное поле и тип:
defmodule Dog do
use Ecto.Model
schema "dogs" do
end
end
defmodule Cat do
use Ecto.Model
schema "cats" do
end
end
defmodule PetOwner do
use Ecto.Model
schema "pet_owners" do
field(:pet, :binary)
field(:pet_type, :integer)
end
end
Или даже просто иметь ссылку на всех животных в схеме владельца, допускающую значение NULL:
defmodule Dog do
use Ecto.Model
schema "dogs" do
belongs_to(:owner, PetOwner)
end
end
defmodule Cat do
use Ecto.Model
schema "cats" do
belongs_to(:owner, PetOwner)
end
end
defmodule PetOwner do
use Ecto.Model
schema "pet_owners" do
has_one(:cat, Cat)
has_one(:dog, Dog)
end
end
Кажется, что первый метод усложняет схемы. Каковы плюсы и минусы разных методов?
Обновлено: Предположим, что владелец домашнего животного может владеть только одним домашним животным, если схема допускает несколько домашних животных, проверка выполняется в наборе изменений.
Я бы, наверное, выбрал последний. Никаких лишних сложностей, целостность и простота.