我有表格Category
和Subcategory
。
Category
有许多subcategories
,Subcategory
属于category
。
在我的频道handle_in
中,有一个插入子类别的功能,如下所示。
def handle_in("create:subcategory", %{"name" => name, "category_id" => category_id}, socket) do
changeset = Subcategory.changeset(%Subcategory{name: name, category_id: category_id})
|>Repo.insert
subcategories = from(p in Pos8.Subcategory, select: map(p, [:id, :name, :category_id])) |> Repo.all
response = %{subcategories: subcategories}
broadcast! socket, "subcategories:updated", response
{:noreply, socket}
end
所以基本上,我想做的是创建name
和category_id
传递的子类别。但它会触发Myapp.Subcategory.category_id in insert does not match type :id
(ecto) lib/ecto/repo/schema.ex:691: Ecto.Repo.Schema.dump_field!/6
(ecto) lib/ecto/repo/schema.ex:700: anonymous fn/6 in Ecto.Repo.Schema.dump_fields!/5
创建category_id
时如何插入subcategory
?
提前致谢..
答案 0 :(得分:1)
如果您要进行测试,您会注意到category_id
是一个字符串。当您尝试使用Repo.get/3
之类的内容查找数据库中的值时,这是可以的,但不幸的是,当尝试插入原始值时,它将无法正常运行。
但是,您应该能够执行类似String.to_integer(category_id)
的操作,并且您可以将其插入正常。
所以你的最终插入行看起来像
changeset =
Subcategory.changeset(%Subcategory{name: name,
category_id: String.to_integer(category_id)})
|> Repo.insert()
正如@Dogbert在评论中指出的那样,你可以让变更集功能处理转换。
changeset =
Subcategory.changeset(%Subcategory{}, %{name: name, category_id: category_id})
|> Repo.insert()
这样做不仅可以处理整数类型。
答案 1 :(得分:0)
这可能有效:
import Ecto.Changeset
parent = Repo.get!(Category, category_id)
subcategory = cast(%Subcategory{}, %{name: name})
|> put_assoc(:category, parent)
|> Repo.insert!