"many_to_many" 如果外键之一是唯一字符串

"many_to_many" if one of the foreign keys is unique string

我有 2 个主要 table:articlestags。他们通过 articles_to_tags table 建立了“many_to_many_ 关系”。有一件事是 tags 的一个键,articlestags 通过它连接键入 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
      ]
    )