elixir phoenix で論理削除する方法
結論、論理削除よりバックアップのほうがいいかも?で使わなくなったんだけどメモ残す。
自前実装前に試したこと
最初にecto_soft_deleteを試したんだけど
- 削除日がUTCから変えられない
- 削除済みデータを取る方法がない という理由で自前実装することになった
自前実装メモ
Migration
defmodule App.Repo.Migrations.CreateItems do use Ecto.Migration def change do create table(:items) do add :did, :string add :deleted_at, :naive_datetime, default: "0000-01-01 00:00:00" end create index("items", [:did, :deleted_at], unique: true) end end
Schema
defmodule App.Items.Item do use Ecto.Schema alias App.Repo schema "items" do field :did, :string field :deleted_at, :naive_datetime end end
Service
def get_item!(did) do Repo.get_by!(Item, [did: did, deleted_at: "0000-01-01 00:00:00"]) end def list do Item |> where([i], i.deleted_at == ^"0000-01-01 00:00:00") |> Repo.all end def delete_item!(%Item{} = item) do item |> change() |> force_change(:deleted_at, NaiveDateTime.local_now) |> Repo.update!() end