4

当前的 Ecto 文档http://hexdocs.pm/ecto/Ecto.Schema.html仅解释了如何构建一种belongs_to多态关联,当多态Comment可以同时属于Task和时Post。但是相反的方向呢?

例如,有一个Listing可以具有以下四种类型之一的属性:RoomApartment或。VilaOffice

考虑到一对一的关系,给定上面的示例,这意味着应该存在rooms_listings、和apartments_listings,这是不可能的,因为这将导致与 关联的所有其他表的重复。vila_listingsoffice_listingslistings

问题是如何建模这种关系?

4

1 回答 1

7

我认为对此建模的最简单方法是翻转关联的两侧,然后将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
于 2015-10-17T10:29:16.613 回答