Обновить поле, если дата старше - PullRequest
0 голосов
/ 16 июня 2020

У меня есть простая таблица аудита:

schema "table" do
  field :unique_field, :string

  field :from_date, :naive_datetime
  field :to_date, :naive_datetime

  timestamps()
end

unique_field имеет уникальное ограничение индекса.

Когда вставляется новая запись, при конфликте, если from_date из новая запись старше текущей, тогда я хочу обновить дату, в противном случае оставьте старую.

Это должно работать, когда много записей добавляется параллельно, что означает, что комбинация Repo.insert и :on_conflict следует использовать.

1 Ответ

0 голосов
/ 16 июня 2020

Вы должны иметь возможность сделать это со значением Ecto.Query в качестве значения on_conflict. Подробнее об этом описано в документации Ecto .

Не тестировал, но примерно так должно работать:

unique_value = 123 # Just as an example
new_from_date = ~D[2020-06-16] # Just as an example
update_query = 
  from(t in "table",
    where: t.unique_field == ^unique_value,
    where: t.from_date < ^new_from_date,
    update: [set: [from_date: ^new_from_date]]
  )

Repo.insert(..., on_conflict: update_query, conflict_target: :unique_field)
...