Удалить осиротевшие записи с Ecto - PullRequest
0 голосов
/ 10 января 2019

У меня есть 3 модели:

user.ex

  schema "users" do 
    ...
    many_to_many(:acts, Act, join_through: UserAct)
  end

act.ex

  schema "acts" do
    ...
    many_to_many(:users, User, join_through: UserAct)
  end

user_act.ex

  schema "users_acts" do
    belongs_to :user, User
    belongs_to :act, Act
  end

Каждый раз, когда я удаляю UserAct, я хочу проверить, есть ли потерянные модели Act, и удалить их в транзакции.

В SQL это выглядит так

DELETE FROM acts WHERE NOT EXISTS (
  SELECT 1 FROM users_acts ua WHERE ua.act_id = acts.id
);

or 

DELETE FROM acts WHERE id NOT IN (SELECT act_id FROM users_acts);

У меня вопрос, как написать аналогичный запрос с Ecto?

Пожалуйста, покажите все методы, которые вы знаете: объединения, фрагменты и т. Д. *

1 Ответ

0 голосов
/ 12 января 2019

Одним из решений является использование фрагментов.

Repo.delete_all(
  from a in Act,
  where: fragment("? NOT IN (SELECT act_id FROM users_acts)", a.id)
)
...