Programming Phoenix 1.4 - deleting videos

In Chapter 6 - Managing related data, we got

video_controller.ex:

def​ delete(conn, %{​"​​id"​ => id}, current_user) ​do​
​  video = Multimedia.get_user_video!(current_user, id) 
​  {​:ok​, _video} = Multimedia.delete_video(video)
​
​  conn
​  |> put_flash(​:info​, ​"​​Video deleted successfully."​)
​  |> redirect(​to:​ Routes.video_path(conn, ​:index​))
​​end​

multimedia.ex

def delete_video(%Video{} = video) do
  Repo.delete(video)
end

def get_user_video!(%Accounts.User{} = user, id) do
  Video
  |> user_videos_query(user)
  |> Repo.get!(id)
end

Is there any reason in particular why we’re doing 2 db hits instead of creating a delete_user_video/1 using user_videos_query/1?

In this case there’s no major difference, but in general it’s not possible to convert every SELECT into a corresponding DELETE - for instance, ecto_sql converts join clauses into USING clauses in PostgreSQL, which only support inner joins.

1 Like