与ecto反向多态

时间:2015-10-17 08:40:57

标签: elixir phoenix-framework ecto

当多态var MyClass = function (param) { this.field1 = param; } MyClass.prototype.changeField = function(param){ this.field1 = param; } var instance = Object.create(MyClass.prototype); 同时属于belongs_to和{{1}时,当前的Ecto文档http://hexdocs.pm/ecto/Ecto.Schema.html仅解释了如何构建Comment类型的多态关联}。但是相反的方向呢?

例如,Task可以包含四种类型的属性之一:PostListingRoomApartment

考虑到一对一的关系,鉴于上面的示例,这意味着应该有VilaOfficerooms_listingsapartments_listings,这是不可能的,因为这将导致与vila_listings相关联的所有其他表的重复。

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

1 个答案:

答案 0 :(得分:5)

我认为最简单的建模方法是翻转关联的两侧,然后只将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