Ecto: получить все выполненные ревизии во время транзакции

Для данной транзакции Ecto, как улучшить ее, чтобы она автоматически добавляла вставки SQL для регистрации всех измененных значений из выполненных наборов изменений? Вот неудачные попытки:

Использование Ecto.Multi:

  • Ecto.Multi.to_list не является решением, поскольку multi может содержать операции Ecto.Multi.run (эти операции необходимы в случае зависимости между операциями: например, при создании учетной записи с ее первым пользователем нам нужно ввести идентификатор учетной записи в наборе изменений пользователя).

  • Добавление последнего Ecto.Multi.run, отвечающего за автоматическое внедрение событий аудита, также невозможно, поскольку параметр changes_so_far является результатом предыдущих операций, а не наборами изменений.

Использование Repo.transaction () с анонимной функцией не возвращает никаких изменений.


person vhiairrassary    schedule 25.08.2016    source источник


Ответы (1)


Из 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 

Это позволит вам сохранить красивый API Ecto.Multi, позволяя легко выполнять дополнительные операции.

person vhiairrassary    schedule 25.08.2016