创建嵌套关联

Create nested associations

请考虑以下架构:

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

展示了如何将两个关联放在一个结构上。

我遵循了该模式并且效果很好。

def create_conversation(%{business: business, contact: contact, message: message} = attrs) do
  business
  |> Ecto.build_assoc(:conversations)
  |> Ecto.Changeset.change()
  |> Ecto.Changeset.put_assoc(:contact, contact)
  |> Repo.insert()
end

但是,我想知道惯用的方法是什么也创建一个 message(这是上面新创建的 conversation 的关联)以便它与此相关联新创建 conversation。在一次 Repo.insert() 调用中执行此操作是否有意义?有 Elixir / Ecto 经验的人会如何解决这个问题?

哇,这太棒了!

def create_conversation(%{business: business, contact: contact, message: message} = attrs) do
  business
  |> Ecto.build_assoc(:conversations)
  |> Ecto.Changeset.change()
  |> Ecto.Changeset.put_assoc(:contact, contact)
  |> Ecto.Changeset.put_assoc(:messages, [%Message{body: message.body}])
  |> Repo.insert()
end