迁移以更改引用列上的 on_delete 选项

Migration for changing on_delete option on references column

我和 Phoenix 一起玩,并建立了 has_many 联想。我通常将 on_delete: :delete_all 作为参考列的选项。但是,如果我改变主意并想稍后为 nilify_all 更改它,有没有办法通过内部迁移来解决这个问题?

创建 table 的迁移:

  def change do
    create table(:messages) do
      add :body, :text
      add :sender_id, references(:users, on_delete: :delete_all)

      timestamps()
    end
    create index(:messages, [:sender_id])

  end

我正在寻找这样的东西:

def change do
  change_options table(:messages), :user_id, on_delete: :nilify_all
end

我看过 modify and alter,但我没有看到任何关于 on_delete 的内容。也许无法通过迁移实现?

您可以为此使用 modify,在新的 type 中传递新的 on_delete 选项,但我在尝试此操作时遇到 this bug,修复就是先手动DROP约束。您还需要指定 updown 版本,因为 modify 是不可逆的。

def up do
  execute "ALTER TABLE posts DROP CONSTRAINT posts_user_id_fkey"
  alter table(:posts) do
    modify(:user_id, references(:users, on_delete: :delete_all))
  end
end

def down do
  execute "ALTER TABLE posts DROP CONSTRAINT posts_user_id_fkey"
  alter table(:posts) do
    modify(:user_id, references(:users, on_delete: :nothing))
  end
end

This Elixir Forum post 注意到 modify() 可以采用 :from 选项;这让您可以使用 change 而不是 up/down,它会为您删除之前的约束:

def change do
  alter table(:messages) do
    modify :sender_id, references(:users, on_delete: :nilify_all),
      from: references(:users, on_delete: :delete_all)
  end
end