为具有嵌套关联的深度嵌套结构创建Ecto变更集

拉斐尔·拉法特帕纳

请考虑以下架构:

schema "businesses" do
  ...
  has_many :contacts, Contact
  has_many :conversations, Conversation
  ...
end
schema "contacts" do
  ...
  belongs_to :business, Business
  has_one :conversation, Conversation
  ...
end
schema "conversations" do
  ...
  belongs_to :business, Business
  belongs_to :contact, Contact
  has_many :messages, Message
  ...
end
schema "messages" do
  belongs_to :conversation, Conversation
  belongs_to :contact, Contact
end

既然我有一个business结构,我将如何创建contactconversation以及message结构的方式,把手协会?

排除messages零件时,以下工作

business
|> Ecto.build_assoc(
  :contacts,
  %Contact{name: name, phone: phone}
)
|> Ecto.Changeset.change()
|> Ecto.Changeset.put_assoc(
  :conversation,
  %Conversation{business: business}
  |> Ecto.Changeset.change()
  |> Ecto.Changeset.cast_assoc(:business)
)
# |> Ecto.Changeset.put_assoc(:messages, [%Message{body: "hello"}])
|> Repo.insert()

倒数第二行没有注释,PostgreSQL让我知道message应该有一个conversation_id并且是正确的。如何设置?

添加一个IO.inspect()

business
|> Ecto.build_assoc(
  :contacts,
  %Contact{name: name, phone: phone}
)
|> Ecto.Changeset.change()
|> Ecto.Changeset.put_assoc(
  :conversation,
  %Conversation{business: business}
  |> Ecto.Changeset.change()
  |> Ecto.Changeset.cast_assoc(:business)
)
  |> IO.inspect()
# |> Ecto.Changeset.put_assoc(:messages, [%Message{body: "hello"}])
|> Repo.insert()

表明在尝试设置messages关联之前,我们正在使用以下变更集

#Ecto.Changeset<
  action: nil,
  changes: %{
    conversation: #Ecto.Changeset<action: :insert, changes: %{}, errors: [],
     data: #Conversation<>, valid?: true>
  },
  errors: [],
  data: #Contact<>,
  valid?: true

有没有一种方式,新创建message成为关联双方的新创建contact和新创建的conversation

拉斐尔·拉法特帕纳

这是可行的Ecto.Multi

https://hexdocs.pm/ecto/Ecto.Multi.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章