Elixir Ecto update_all 并不总是有效
Elixir Ecto update_all doesn't always work
我们有一个身份-用户关系,其中一个身份可以有很多用户。有一种方法可以使用此代码将 link 用户绑定到一个身份。
from(u in ZB.User, where: u.identity_id == ^to_link_identity.id)
|> ZB.Repo.update_all(set: [identity_id: user.identity_id])
ZB.Repo.delete(to_link_identity)
有时(大多数情况下这工作正常)这会抛出错误,因为 to_link_identity
上的外键识别出仍有用户连接到它,表明 update_all
没有' 将所有用户更新为新 identity_id
。从文档 (https://hexdocs.pm/ecto/Ecto.Repo.html#c:update_all/3) 我看不到捕获错误的方法。有没有更好的处理方法来避免这个错误?
根据 Justin Wood 的建议,我提出了这个解决方案,似乎可以解决问题。
Ecto.Multi.new()
|> Ecto.Multi.update_all(:update, from(u in ZB.User, where: u.identity_id == ^to_link_identity.id), set: [identity_id: user.identity_id])
|> Ecto.Multi.delete(:delete, to_link_identity)
|> ZB.Repo.transaction
我们有一个身份-用户关系,其中一个身份可以有很多用户。有一种方法可以使用此代码将 link 用户绑定到一个身份。
from(u in ZB.User, where: u.identity_id == ^to_link_identity.id)
|> ZB.Repo.update_all(set: [identity_id: user.identity_id])
ZB.Repo.delete(to_link_identity)
有时(大多数情况下这工作正常)这会抛出错误,因为 to_link_identity
上的外键识别出仍有用户连接到它,表明 update_all
没有' 将所有用户更新为新 identity_id
。从文档 (https://hexdocs.pm/ecto/Ecto.Repo.html#c:update_all/3) 我看不到捕获错误的方法。有没有更好的处理方法来避免这个错误?
根据 Justin Wood 的建议,我提出了这个解决方案,似乎可以解决问题。
Ecto.Multi.new()
|> Ecto.Multi.update_all(:update, from(u in ZB.User, where: u.identity_id == ^to_link_identity.id), set: [identity_id: user.identity_id])
|> Ecto.Multi.delete(:delete, to_link_identity)
|> ZB.Repo.transaction