Elixir/Ecto 插入多对多时 FK 为空 table

Elixir/Ecto null FK's on insert into many-to-many table

问题:多对多 table 的 FK 字段保持为空 我有一个简单的多对多 table 来加入用户 table 和雇主 table:

用户table:

  schema "users" do
    field :email, :string
    field :first_name, :string
    field :hashed_password, :string, redact: true
    field :password, :string, virtual: true
    field :password_confirmation, :string, virtual: true
    field :is_active, :boolean, default: false
    field :last_name, :string
    field :middle_name, :string

    many_to_many :employers, Employer, join_through: UserEmployer

    timestamps()
  end

雇主table:

 schema "employers" do
    field :employer_name, :string

    many_to_many :users, User, join_through: UserEmployer

    timestamps()
  end

用户雇主table:

  schema "users_employers" do
    belongs_to :users, User
    belongs_to :employers, Employer
    
    timestamps()
  end

为了在 iex 中使用这个关联,我正在抓取一个用户 (user1) 和一个雇主 (employer1) 和 运行:

user1 
|> Repo.preload(:employers) 
|> User.changeset(%{}) 
|> Ecto.Changeset.put_assoc(:employers, [employer1]) 
|> Repo.update!

输出:

17:01:23.896 [debug] QUERY OK db=0.8ms
INSERT INTO "users_employers" ("inserted_at","updated_at","id") VALUES (,,) [~N[2021-05-17 17:01:23], ~N[2021-05-17 17:01:23], <<97, 185, 97, 180, 30, 80, 73, 50, 130, 255, 57, 243, 107, 136, 85, 74>>]
17:01:23.898 [debug] QUERY OK db=2.3ms
commit []
%DB.Users.User{
  __meta__: #Ecto.Schema.Metadata<:loaded, "users">,
  email: "mafia4lye@gmail.com",
  employers: [
    %DB.Employers.Employer{
      __meta__: #Ecto.Schema.Metadata<:loaded, "employers">,
      employer_name: "Employer Number 1",
      id: "0ed08a40-7315-4c90-a2cf-7d66cb5b7b89",
      inserted_at: ~N[2021-05-17 16:31:41],
      updated_at: ~N[2021-05-17 16:31:41],
      users: #Ecto.Association.NotLoaded<association :users is not loaded>
    }
  ],
  first_name: "Vito",
  hashed_password: "not_hashed_yet",
  id: "9e0d7497-0fb5-48f6-a0ba-7c6af2f6daf7",
  inserted_at: ~N[2021-05-17 16:31:42],
  is_active: true,
  last_name: "Corleone",
  middle_name: "Mob",
  password: nil,
  password_confirmation: nil,
  updated_at: ~N[2021-05-17 16:31:42]
}

该行被插入到 UsersEmployers table,但是 FK 的 user_id 和 employer_id 为空。

您应该在 belongs_to 关联中使用“单数”形式(而不是“复数”形式):

  schema "users_employers" do
    belongs_to :user, User
    belongs_to :employer, Employer
    
    timestamps()
  end