【问题标题】:Inverse polymorphic with ecto带有ecto的逆多态性
【发布时间】:2023-03-20 03:08:02
【问题描述】:

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

例如,Listing 可以具有以下四种属性之一:RoomApartmentVilaOffice

考虑一对一的关系,给定上面的例子,这意味着应该有rooms_listingsapartments_listingsvila_listingsoffice_listings,这是不可能的,因为这会导致重复与listings 关联的所有其他表。

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

【问题讨论】:

    标签: elixir phoenix-framework ecto


    【解决方案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
    

    【讨论】:

    • Patrick,但如果仅从理论上讲,会有 20 种不动产类型呢?然后呢?
    • @lessless 看看这个相关的答案,它详细介绍了使用具体超表的设计,这将消除每种房地产类型对额外列的需求,同时还确保您可以使用外键确保参照完整性的约束:stackoverflow.com/questions/922184/…
    • @lessless 还值得指出的是,使用 20 种类型仍然会更快,占用更少的空间(因为它们中的大多数都是 nil)并保持数据库的完整性,而提出的多态方法仍然不会't。
    • @JoséValim 您指的是什么方法?文档中提到的那个,还是带有 supertable 的那个?
    • 我是在回答您的问题:“Patrick,但如果仅从理论上讲,会有 20 种不动产类型呢?然后呢?” :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-11
    相关资源
    最近更新 更多