seeds.ex中的无效变更集

时间:2018-02-28 04:13:06

标签: elixir phoenix-framework

我试图在我的种子中运行它.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
})

1 个答案:

答案 0 :(得分:0)

Elixir中的

struct底部是map,而Elixir中的地图不能有相同的键:

%Management{manager_id: 1, managed_id: 2}
%{foo: 42, foo: :bar}

以上所有内容均无效。它与Ecto,数据库或Repo无关:它是Elixir纯语法问题。 (从技术上讲,它不是无效的,它只是丢弃前一个值并使用后者,在iex中尝试foo-example来查看问题。)因此,您的Management结构只有一个{{ 1}}字段,使关联无效。

要解决此问题,您应该使用唯一名称授予关系。