Ecto:检索事务期间所有已执行的变更集
Ecto: Retrieve all executed changesets during a transaction
对于给定的 Ecto 事务,如何改进它以自动添加 SQL 插入以记录执行的变更集中的所有更改值?以下是不成功的尝试:
使用Ecto.Multi:
Ecto.Multi.to_list 不是解决方案,因为 multi 可以包含 Ecto.Multi.运行 操作(在以下情况下需要这些操作操作之间的依赖关系:例如,当为其第一个用户创建帐户时,我们需要在用户变更集中注入帐户 ID)。
添加负责自动注入审计事件的最终 Ecto.Multi.运行 也是不可能的,因为 changes_so_far
参数是先前的结果操作而不是变更集。
将 Repo.transaction() 与匿名函数一起使用不会 return 任何变更集。
来自https://groups.google.com/forum/#!topic/elixir-ecto/5M6VA8fg364:
目前没有这样的功能,我不赞成添加它 - 这可以在今天实现,而无需对 API 进行任何更改。
如果我要创建一个这样做的系统,我很可能会将 Ecto.Multi 函数包装在我自己的函数中,以添加额外的跟踪 - 例如:
defmodule MyApp.Multi do
def insert(multi, name, changeset) do
multi
|> Ecto.Multi.insert(name, changeset)
|> Ecto.Multi.insert({:log, name}, build_log(changeset))
end
end
这将允许您保留 Ecto.Multi 的 API,同时允许您轻松地执行其他操作。
对于给定的 Ecto 事务,如何改进它以自动添加 SQL 插入以记录执行的变更集中的所有更改值?以下是不成功的尝试:
使用Ecto.Multi:
Ecto.Multi.to_list 不是解决方案,因为 multi 可以包含 Ecto.Multi.运行 操作(在以下情况下需要这些操作操作之间的依赖关系:例如,当为其第一个用户创建帐户时,我们需要在用户变更集中注入帐户 ID)。
添加负责自动注入审计事件的最终 Ecto.Multi.运行 也是不可能的,因为
changes_so_far
参数是先前的结果操作而不是变更集。
将 Repo.transaction() 与匿名函数一起使用不会 return 任何变更集。
来自https://groups.google.com/forum/#!topic/elixir-ecto/5M6VA8fg364:
目前没有这样的功能,我不赞成添加它 - 这可以在今天实现,而无需对 API 进行任何更改。 如果我要创建一个这样做的系统,我很可能会将 Ecto.Multi 函数包装在我自己的函数中,以添加额外的跟踪 - 例如:
defmodule MyApp.Multi do
def insert(multi, name, changeset) do
multi
|> Ecto.Multi.insert(name, changeset)
|> Ecto.Multi.insert({:log, name}, build_log(changeset))
end
end
这将允许您保留 Ecto.Multi 的 API,同时允许您轻松地执行其他操作。