考虑一种情况,您尝试对银行交易记录进行建模。交易具有金额,类型(贷记或借记),并且与帐户关联。
在添加新的银行交易的情况下,我可以这样做,并且效果很好:
Multi.new()
|> Multi.insert(:transaction, transaction_changeset)
|> Multi.update(:account, account_changeset)
|> Repo.transaction()
更新现有的银行交易涉及更多。这是因为用户不仅可以更改金额,还可以更改帐户。更新现有交易可能意味着除了将金额添加到当前帐户之外,还从先前的帐户中删除了该金额。我尝试了此操作,但是不确定如何表达我要使用的功能Ecto.Multi
。
Multi.new()
|> Multi.update(:transaction, transaction_changeset)
|> Multi.update(:account, previous_account_changeset)
|> Multi.update(:account, current_account_changeset)
|> Repo.transaction()
运行时错误:帐户已经是Ecto.Multi的成员:
这里的问题是您:account
两次使用密钥。从文档中:
Ecto.Multi
使打包应在单个数据库事务中执行的操作成为可能,并提供了一种对已排队的操作进行自省的方法,而无需实际执行。每个操作都有一个唯一的名称,如果成功或失败,它将识别其结果。
您可以选择任何喜欢的名称,只要它是唯一的即可。只需将您的交易更改为:
Multi.new
|> Multi.update(:transaction, transaction_changeset)
|> Multi.update(:previous_account, previous_account_changeset)
|> Multi.update(:current_account, current_account_changeset)
|> Repo.transaction
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句