Ecto:处理embedded_schema中的深层嵌套关联

问题描述 投票:0回答:1

我正在制作复杂的注册表。 我的用户将拥有他们的个人资料,其中包含联系信息和项目集合。 我的架构(用户、个人资料、电话、集合、项目)如下所示:

defmodule MyProject.User

  schema "users" do
    field :email, :string
    field :name, :string
    has_many :profiles, MyProject.Profile, on_delete: :delete_all
    has_many :collections, through: [:profiles, :collections]
    timestamps()    
  end
end

defmodule MyProject.Profile

  schema "profiles" do
    field :address, :string
    field :skype, :string
    belongs_to :user, MyProject.User
    has_many :phones, MyProject.Phone, on_delete: :delete_all
    has_many :collections, MyProject.Collection, on_delete: :delete_all
    timestamps()    
  end
end  

defmodule MyProject.Phone

  schema "phones" do
    field :phone, :string
    belongs_to :profile, MyProject.Profile
  end
end

defmodule MyProject.Collection

  schema "collections" do
    field :name, :string
    has_many :items, MyProject.Item, on_delete: :delete_all
    timestamps()    
  end
end

defmodule MyProject.Item

  schema "items" do
    field :name, :string
    field :type, :string
    field :url, :string
    belongs_to :collection, MyProject.Collection
    timestamps()    
  end
end 

现在我需要构建复杂的注册表单,该表单允许使用一些手机和一个集合(其中包含一些项目)一次性创建用户及其个人资料,并提交一张表单。 由于表注册不存在,我认为我需要为此使用Embedded_schema,因为它与数据库表无关:

defmodule MyProject.Registration

  embedded_schema do

  end
end

但我不确定如何描述其中的所有嵌套关联。我应该使用 has_one、has_many 或 embed_one、embed_many 或两者都不使用,有何影响? 如何构建表单,我应该使用 input_for 进行嵌套关联吗? 如何将所有关联值保存到数据库以保留所有关系? 首先,需要保存用户,然后是他的个人资料,然后是一些电话,然后是集合,最后是一些项目。所有这些都应该联系在一起。

elixir phoenix-framework nested-forms ecto
1个回答
0
投票

我知道这个问题很古老,但它总是出现在我的搜索中。

不太令人满意,但最好的答案是,这取决于情况。

embeds_one
/
embeds_many
不会跟踪相同的记录,因为它们没有
on_replace: :update
选项。这意味着,如果您多次运行变更集(例如,每次用户添加新输入时在 LiveView 中),您的变更集将无法跟踪原始记录的内容。

因此,我建议使用

has_one
/
has_many
,因为它更容易跟踪原始记录。

从那里我会考虑使用

Multi
操作从您的
embedded schema
获取特定数据并将其转换为记录以保存到数据库中。

© www.soinside.com 2019 - 2024. All rights reserved.