使用Ecto插入多个多对多关系

时间:2019-04-07 18:00:14

标签: elixir ecto

我有一个数据模型,其中用户可以拥有视频以及属性,类似于:

data model of current webapp

我希望能够将多个视频发布到媒体资源。目前,我使用put_assoc,并具有类似于以下代码:

def publish_videos_to_property(user, property, video_ids) when is_list(video_ids) do
    videos =
      Video
      |> where([video], video.id in ^video_ids and video.user_id == ^user.id)
      |> Repo.all()

    with {:ok, _struct} <-
           property
           |> Property.changeset_update_videos(videos)
           |> Repo.update() do
      {:ok, Properties.get_property(user, property.id)}
    else
      error -> error
    end
end

并按如下所示使用put_assoc:

def changeset_update_videos(property, videos) do
    property
    |> cast(%{}, @required_fields ++ @optional_fields)
    |> put_assoc(:videos, videos)
end

这可以正常工作,但是如果已经存在关系将被删除,这是不受欢迎的行为。

我可以:

  • 查询已经关联的视频并将其合并到视频数组中
  • 使用multi
  • 将所有记录直接插入已发布表中

对这种行为进行编码的最佳方法是什么?有没有更富有表现力的方式可以做到这一点?

0 个答案:

没有答案