如何在many_to_many关联中添加和删除关系?

时间:2016-09-07 17:19:39

标签: elixir ecto

因此,根据Ecto文档中的示例,我有以下内容:

defmodule Post do
  use Ecto.Schema
  schema "posts" do
    many_to_many :tags, Tag, join_through: "posts_tags"
  end
end

defmodule Tag do
  use Ecto.Schema
  schema "tags" do
    many_to_many :posts, Post, join_through: "posts_tags"
  end
end

现在有什么不同的方法:

a)将现有帖子与现有标签相关联。

b)取消现有帖子与标签的关联。

注意我不希望创建嵌套资源,但情况是我有%Post{}tag_id,我希望创建或销毁它们之间的关联。

1 个答案:

答案 0 :(得分:6)

我可以想到两种方法,不需要为帖子加载所有标签:

  1. 为联接表创建一个模块,例如PostTag然后通过创建/删除PostTag行来关联/取消关联:

    # web/models/post_tag.ex
    defmodule PostTag do
      use Ecto.Schema
    
      @primary_key false
      schema "posts_tags" do
        belongs_to :post, Post
        belongs_to :tag, Tag
      end
    end
    
    # Create association
    Repo.insert!(%PostTag(post_id: 1, tag_id: 2))
    
    # Remove association
    Repo.get_by(PostTag, post_id: 1, tag_id: 2) |> Repo.delete!
    
  2. 直接在Repo.insert_all/2表格上使用Repo.delete_all/2posts_tags

    # Create assoication
    Repo.insert_all "posts_tags", [%{post_id: 1, tag_id: 2}]
    
    # Delete association
    Repo.delete_all "posts_tags", [%{post_id: 1, tag_id: 2}]