Ecto 中 `many_to_many` 关联的外键名称

Foreign key name for `many_to_many` association in Ecto

这里是 many_to_many 协会的问题。我得到的错误是

INSERT INTO "qbinders" ("title","typecode","inserted_at","updated_at","id") VALUES (,,,,) ["Math", "Jim1000", {{2017, 4, 1}, {15, 4, 47, 827009}}, {{2017, 4, 1}, {15, 4, 47, 843348}}, <<68, 1
49, 156, 219, 153, 214, 65, 63, 179, 141, 252, 147, 221, 247, 41, 143>>]
[debug] QUERY OK db=0.9ms
commit []
** (Postgrex.Error) ERROR 42703 (undefined_column): column q2.qbinders_id does not exist

在运行

qbinder_map = %{ title: "Math", typecode: "Jim1000"}
changeset = Qbinders.changeset(%Qbinders{}, qbinder_map)
qbinder = Repo.insert!(changeset) |> Repo.preload(:qbooks)

qbook_list = 
  %Qbooks{ title: "Algebra1"}
qbook = Repo.insert!(qbook_list) |> Repo.preload(:qbinders)

changeset = Ecto.Changeset.change(qbinder) 
            |> Ecto.Changeset.put_assoc(:qbooks, [qbook_list])
Repo.update!(changeset)

在 postgres 中,连接 table 看起来像

CREATE TABLE qbook2qbinder
(
  qbook_id uuid,
  qbinder_id uuid,
  qbook_order integer,
  inserted_at timestamp without time zone NOT NULL,
  updated_at timestamp without time zone NOT NULL,
  CONSTRAINT qbook2qbinder_qbinder_id_fkey FOREIGN KEY (qbinder_id)
      REFERENCES qbinders (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT qbook2qbinder_qbook_id_fkey FOREIGN KEY (qbook_id)
      REFERENCES qbooks (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)

模型是

defmodule Project.Qbinders do
  use Project.Web, :model

  @primary_key {:id, :binary_id, autogenerate: true}

  schema "qbinders" do

        field :title, :string
        field :reward, :string

        many_to_many :qbooks, Project.Qbooks, join_through: "qbook2qbinder"
    timestamps
  end

为什么 Ecto 寻找 qbinders_id 而不是 qbinder_id?如何设置为 qbinder_id?

options argument of Ecto.Schema.many_to_many/3.

可以轻松自定义

列名可以用选项 join_keys 配置,应该像这样使用:

many_to_many :qbooks, Project.Qbooks, join_through: "qbook2qbinder",
                                      join_keys: [{qbook_id: :id, qbinder_id: :id}]