对于 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
)中。据我所知,我将有以下选择:
: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
添加关系我更喜欢第一个选项,因为在我看来这将是最干净的方法。
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/