【问题标题】:Create nested associations创建嵌套关联
【发布时间】:2020-11-01 01:09:14
【问题描述】:

请考虑以下架构:

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

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

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

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 经验的人会如何解决这个问题?

【问题讨论】:

    标签: elixir associations ecto


    【解决方案1】:

    哇,这行得通!

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多