"many_to_many" 如果外键之一是唯一字符串
"many_to_many" if one of the foreign keys is unique string
我有 2 个主要 table:articles
和 tags
。他们通过 articles_to_tags
table 建立了“many_to_many_ 关系”。有一件事是 tags
的一个键,articles
和 tags
通过它连接键入 string
。在数据库级别,它们如下所示:
tags:
- id
- name (unique)
articles
- id
- title
- body
articles_to_tags:
- article_id
- tag_name /* !! */
关于 Ecto 的水平:
# articles_to_tags
@primary_key false
schema "articles_to_tags" do
belongs_to(:article, Article)
belongs_to(:tag, Tag, references: :name, foreign_key: :tag_name, type: :string)
end
即使我已经用测试数据填充了一个数据库,该数据库为一篇文章分配了一些标签,但在我的项目中,一篇文章仍然有 0 个标签:
article = Repo.get(Article, 123) |> Repo.preload(:tags)
IO.puts("*** article tags len: #{length(article.tags)}")
为什么?
我试过 join_keys
,但结果很混乱,并没有解决问题:
schema "articles" do
# ................
many_to_many(:tags, Tags, join_through: ArticleToTag,
join_keys: [
tag_name: :name, # 'name' of which table?
article_id: :id # 'id' of which table?
]
)
如何解决?
必须通过“tag.name”而不是“tag.id”加入 table。
来自文档:https://hexdocs.pm/ecto/Ecto.Schema.html#many_to_many/3
:join_keys - ..,expects a keyword list with two entries, the first being how the join table should reach the current schema and the second how the join table should reach the associated schema.
所以您应该尝试在您的文章架构中执行此操作:
schema "articles" do
# ................
many_to_many(:tags, Tags, join_through: ArticleToTag,
join_keys: [
article_id: :id # 'id' of current schema
tag_name: :name, # 'name' of associated schema
]
)
我有 2 个主要 table:articles
和 tags
。他们通过 articles_to_tags
table 建立了“many_to_many_ 关系”。有一件事是 tags
的一个键,articles
和 tags
通过它连接键入 string
。在数据库级别,它们如下所示:
tags:
- id
- name (unique)
articles
- id
- title
- body
articles_to_tags:
- article_id
- tag_name /* !! */
关于 Ecto 的水平:
# articles_to_tags
@primary_key false
schema "articles_to_tags" do
belongs_to(:article, Article)
belongs_to(:tag, Tag, references: :name, foreign_key: :tag_name, type: :string)
end
即使我已经用测试数据填充了一个数据库,该数据库为一篇文章分配了一些标签,但在我的项目中,一篇文章仍然有 0 个标签:
article = Repo.get(Article, 123) |> Repo.preload(:tags)
IO.puts("*** article tags len: #{length(article.tags)}")
为什么?
我试过 join_keys
,但结果很混乱,并没有解决问题:
schema "articles" do
# ................
many_to_many(:tags, Tags, join_through: ArticleToTag,
join_keys: [
tag_name: :name, # 'name' of which table?
article_id: :id # 'id' of which table?
]
)
如何解决?
必须通过“tag.name”而不是“tag.id”加入 table。
来自文档:https://hexdocs.pm/ecto/Ecto.Schema.html#many_to_many/3
:join_keys - ..,expects a keyword list with two entries, the first being how the join table should reach the current schema and the second how the join table should reach the associated schema.
所以您应该尝试在您的文章架构中执行此操作:
schema "articles" do
# ................
many_to_many(:tags, Tags, join_through: ArticleToTag,
join_keys: [
article_id: :id # 'id' of current schema
tag_name: :name, # 'name' of associated schema
]
)