对于多租户电子商务应用程序,我给出了以下ER模式:
Order has_many OrderProduct belongs_to Product belongs_to Price
使用Ecto,在订单的变更集功能中通过cast_assoc(:order_product)
一次性插入带有许多 OrderProduct 的订单会很容易。
但由于将来可能会删除产品以及 Price ,我还想另外存储 Price 的值 OrderProducts (:price
,:quantity
)中的数量。
据我所知,我会有以下选择:
:price
添加为 OrderProduct 的更改。这将导致N + 1个查询,因为我必须为 Order 中的每个 OrderProduct 执行该查询(在这种情况下这是可以的,因为我只有一个有限的数字产品每订单)。但此外,我更愿意保留模式定义模块的回购。但最重要的是:我在多租户设置中使用不同的模式,因此我需要知道 OrderProduct 的变更集功能中的prefix
,以便在正确的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
我更喜欢第一种选择,因为在我看来,这将是最干净的方法。
答案 0 :(得分:1)
Ecto.Changeset.prepare_changes/2
是另一种选择,可能是您正在寻找的选项:https://hexdocs.pm/ecto/Ecto.Changeset.html#prepare_changes/2