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
问题:多对多 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