因此,根据Ecto文档中的示例,我有以下内容:
defmodule Post do
use Ecto.Schema
schema "posts" do
many_to_many :tags, Tag, join_through: "posts_tags"
end
end
Run Code Online (Sandbox Code Playgroud)
和
defmodule Tag do
use Ecto.Schema
schema "tags" do
many_to_many :posts, Post, join_through: "posts_tags"
end
end
Run Code Online (Sandbox Code Playgroud)
现在有什么不同的方式:
a)将现有帖子与现有标签相关联.
b)取消现有帖子与标签的关联.
注意我不希望创建嵌套资源,但情况是我有a %Post{}和a tag_id,我希望创建或销毁它们之间的关联.
我可以想到两种方法,不需要为帖子加载所有标签:
为连接表创建一个模块,例如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!
Run Code Online (Sandbox Code Playgroud)使用Repo.insert_all/2和Repo.delete_all/2对直接posts_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}]
Run Code Online (Sandbox Code Playgroud)