我试图在我的种子中运行它.ex
Repo.insert!(%User{
email: "aadmin@aadmin.com",
username: "aadmin"
})
Repo.insert!(%User{
email: "Jack@Jack.com",
username: "Jack"
})
Repo.insert!(%User{
email: "Jill@Jill.com",
username: "Jill"
})
Repo.insert!(%Task{
title: "test",
owner_id: 1,
assignee_id: 2,
status_id: 2
})
Repo.insert!(%Management{
manager_id: 1,
managed_id: 2
})
这是我的management.ex
schema "managements" do
belongs_to(:manager_id, User)
belongs_to(:managed_id, User)
timestamps()
end
@doc false
def changeset(%Management{} = management, attrs) do
management
|> cast(attrs, [:manager_id, :managed_id])
|> validate_required([:manager_id, :managed_id])
end
这是我的user.ex
schema "users" do
field(:email, :string)
field(:username, :string)
has_one(:manager_user, Management, foreign_key: :manager_id)
has_many(:managed_user, Management, foreign_key: :managed_id)
has_one(:managers, through: [:manager_user, :manager])
has_many(:manageds, through: [:managed_user, :managed])
timestamps()
end
当我尝试mix ecto.reset
时,它会告诉我could not perform insert because changeset is invalid.
与
Applied changes
%{}
Params
nil
Errors
%{manager_id: ["is invalid"]}
Changeset
#Ecto.Changeset<
action: :insert,
changes: %{},
errors: [manager_id: "is invalid"],
data: #Tasktracker.Accounts.Management<>,
valid?: false
>
但我填写了manager_id和managed_id,其中包含刚刚在其上创建的有效用户ID。我不明白为什么它没有显示错误中的ID,只告诉我&#34;无效&#34;
请解释我的
有什么问题Repo.insert!(%Management{
manager_id: 1,
managed_id: 2
})
答案 0 :(得分:0)
struct
底部是map
,而Elixir中的地图不能有相同的键:
%Management{manager_id: 1, managed_id: 2}
%{foo: 42, foo: :bar}
以上所有内容均无效。它与Ecto
,数据库或Repo
无关:它是Elixir纯语法问题。 (从技术上讲,它不是无效的,它只是丢弃前一个值并使用后者,在iex
中尝试foo-example来查看问题。)因此,您的Management
结构只有一个{{ 1}}字段,使关联无效。
要解决此问题,您应该使用唯一名称授予关系。