gpt4 book ai didi

elixir - 插入时预加载 Ecto 关联

转载 作者:行者123 更新时间:2023-12-03 19:36:01 25 4
gpt4 key购买 nike

对于 Multi-Tenancy 电子商务应用程序,我给出了以下 ER 模式:

Order has_many OrderProduct belongs_to Product belongs_to Price

使用 Ecto,可以轻松地通过 cast_assoc(:order_product) 一次插入包含多个 OrderProduct 的订单。在 Order 的变更集函数中。

但是由于将来可能会删除 Product 和 Price ,我想另外将 Price 和数量的值存储在 OrderProducts ( :price:quantity )中。

据我所知,我将有以下选择:
  • 在 OrderProduct 的变更集函数中,我可以通过 Product 的 ID 获取 Product 并加入 Price 并添加 :price价格作为 OrderProduct 的更改。这将导致 N+1 个查询,因为我必须对 Order 中的每个 OrderProduct 执行该查询(在这种情况下这没问题,因为我每个订单只有有限数量的产品)。但此外,我更愿意保留模式定义模块的 Repo。但最重要的是:我在 Multi-Tenancy 设置中使用了不同的模式,所以我需要知道 prefix在 OrderProduct 的变更集函数中对正确的 prefix 执行查询.
  • 在我的 Orders 中的模式定义之外迭代 OrderProducts模块并添加 :price作为对 OrderProduct 变更集的更改:
  • %Order{} 
    |> Order.changeset(attrs)
    |> iterate_order_products_and_map_price_change(tenant)
    |> Repo.insert(prefix: tenant)
  • 使用Ecto.Multi首先插入订单,然后我使用额外的 Ecto.Multi.run 添加关系

  • 我更喜欢第一个选项,因为在我看来这将是最干净的方法。
  • 对于这种情况,还有其他或更好的选择吗?
  • 是否也可以通过在模式之外的插入上通过连接 Product 和 OrderProduct 的价格来预加载?那我就没有 N+1在 1.?
  • 最佳答案

    Ecto.Changeset.prepare_changes/2是另一种选择,可能是您正在寻找的选择:https://hexdocs.pm/ecto/Ecto.Changeset.html#prepare_changes/2

    关于elixir - 插入时预加载 Ecto 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48497471/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com