【发布时间】:2018-10-11 14:09:32
【问题描述】:
所以我刚刚开始摆弄 Phoenix 和 Elixir。所以我已经达到了这一点,即我正在尝试让一个工作的 rest-api 端点与先决条件 JSON 一起工作。
所以我有这个模块:
defmodule MyApp.Housing.Part do
use Ecto.Schema
import Ecto.Changeset
@primary_key {:id, :integer, []}
schema "parts" do
field :level, :integer
field :title, :string
belongs_to :parent, MyApp.Housing.Part
has_many :children, MyApp.Housing.Part, foreign_key: :parent_id
timestamps()
end
def changeset(part, params \\ %{}) do
part
|> cast(params, [:title, :level, :id, :parent_id])
|> put_assoc(:children, required: false)
|> put_assoc(:parent, required: false)
|> validate_required([:title, :level, :id])
end
end
以及创建表的模块
defmodule MyApp.Repo.Migrations.CreateParts do
use Ecto.Migration
def change do
create table(:parts, primary_key: false) do
add :id, :integer, primary_key: true
add :title, :string
add :level, :integer
add :parent_id, references(:parts)
add :children, references(:parts)
timestamps()
end
create index(:parts, [:children])
create index(:parts, [:parent_id])
end
end
inteded 功能是让一个部件能够有多个孩子,但只有一个父母。这些是在 JSON 中定义的,如下所示:
{"id": 10,
"title": "Matt",
"level": 0,
"children": [],
"parent_id": null}
所以我的问题如下:
- “changeset”要求传入的对象看起来像
{"part":{}}否则会抛出 ActionClauseError。 - 如上定义对象时,我收到错误
children":["is invalid"]。而且我不知道如何获得有效的,如果我这样做了,我可能会找出问题所在。
我可能在这里采取了错误的方法,但很乐意接受任何帮助。
【问题讨论】:
标签: postgresql elixir phoenix-framework ecto