mam ten oryginalny migracji, które zostały już uruchomić i wysłany upstream:Modyfikuj klucz obcy w Ecto
create table(:videos) do
add :url, :string
add :title, :string
add :description, :text
add :user_id, references(:users, on_delete: :nothing)
timestamps
end
create index(:videos, [:user_id])
Teraz chciałbym zmienić klucz obcy na user_id
kaskady delecji, tak, że gdy użytkownik zostanie usunięty wszystkie powiązane z nim filmy również zostaną usunięte.
Próbowałem następujące migracji:
alter table(:videos) do
modify :user_id, references(:users, on_delete: :delete_all)
end
Ale tu pojawia się błąd:
(Postgrex.Error) ERROR (duplicate_object): constraint "videos_user_id_fkey" for relation "videos" already exists
Jak mogę sformułować scenariusz migracji, które zmienią ten klucz obcy według moich wymagań?
UPDATE
skończyło się następujące rozwiązanie:
def up do
execute "ALTER TABLE videos DROP CONSTRAINT videos_user_id_fkey"
alter table(:videos) do
modify :user_id, references(:users, on_delete: :delete_all)
end
end
def down do
execute "ALTER TABLE videos DROP CONSTRAINT videos_user_id_fkey"
alter table(:videos) do
modify :user_id, references(:users, on_delete: :nothing)
end
end
ten spada ograniczenie przed ekto próbuje go odtworzyć.
Masz odpowiedź pracuje w kwestionujesz, it'be przydatna, aby opublikować go jako oddzielny odpowiedź więc każdy może głosować. –