elixir - 插入时预加载 Ecto 关联

标签 elixir phoenix-framework ecto

对于 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/

    相关文章:

    elixir - Circumflex sign/Pin/Cap 运算符 (^) 在 Elixir 中有什么作用?

    elixir - 在 Phoenix 应用程序中提取微服务 : Genserver

    elixir - 无法转换为类型 :naive_datetime in query

    elixir - 如何在Phoenix中处理模式多态性?

    linux - 我无法在我的 ubuntu 18.10 cosmic 系统上安装 erlang/Elixir

    erlang - 功能重叠规范

    hex - 如何使用 Elixir 打包/解包十六进制字符串(先是高半字节)

    iis - 在 Windows 上的 IIS 中运行 Phoenix 时内存泄漏/CPU 使用率持续居高不下

    postgresql - 设置事务隔离级别时的 Phoenix/Elixir 测试

    postgresql - 适配器 Ecto.Adapters.Postgres 未编译