Ecto - 更新多个has_many记录

时间:2016-06-21 05:37:16

标签: phoenix-framework ecto

在编程凤凰书中,有视频和类别。这本书有很多:一个用于视频:类别(许多视频可以属于一个类别)。想象一下视频可以属于多个类别的情况。现在,这变成了许多:许多关系。因此,如果有一个video_categories表,我们如何同时更新视频和类别的标题?我们可以通过变更集来实现吗?

此处的更新代码必须在假定视频和类别的多对多关系的情况下进行修改:

https://media.pragprog.com/titles/phoenix/code/relationships/listings/rumbl/web/controllers/video_controller.change1.ex

我无法合并视频的所有类别的变更集(我收到数据不同的错误)。那么我们还能做些什么呢?

一种出路似乎在交易中运行事物

  1. 开始交易
  2. 获取视频标题更改的变更集
  3. 更新视频标题更改集的回购
  4. 使用Repo.update_all更新VideoCategory模型的所有category_ids
  5. 结束交易
  6. 另一种方式似乎是如此使用Ecto 2.0的many_to_many:

    defmodule Video do
      ...
         many_to_many :categories, Category, join_through: "video_categories", on_replace: :delete
      ...
    
      def changeset(model, categories, params \\ %{}) do
         model
         |> cast(..)
         |> put_assoc(:categories, categories)
         |> ... 
      end
    end
    

    这样,video_categories中的记录将被删除并插入。理想情况下,如果更新,它将导致一个查询而不是删除和插入。现在我知道db通常会在更新时删除/插入,但那是一个内部的dbms细节。从外部看,最好是看到一个更新查询被执行。

    有没有更好的方法来处理这种情况?

0 个答案:

没有答案