とんたんの技術メモ

注)ただのメモです。

elixir phoenix で論理削除する方法

結論、論理削除よりバックアップのほうがいいかも?で使わなくなったんだけどメモ残す。

自前実装前に試したこと

hexdocs.pm

最初に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