Elixir 如何使用通道插入外键id?

Elixir 如何使用通道插入外键id?,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,我有表格,类别和子类别 类别有许多子类别,子类别属于类别 在中的我的频道handle_中,有一个插入子类别的函数,如下所示 def handle_in("create:subcategory", %{"name" => name, "category_id" => category_id}, socket) do changeset = Subcategory.changeset(%Subcategory{name: name, category_id: category_id})

我有表格,
类别
子类别

类别
有许多
子类别
子类别
属于
类别

在中的我的频道
handle_中,有一个插入子类别的函数,如下所示

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\u id
。但它会触发一个错误,即insert中的
Myapp.Subcategory.category\u id与type:id不匹配
(exto)lib/exto/repo/schema.ex:691:exto.repo.schema.dump_字段/6.
(exto)lib/exto/repo/schema.ex:700:exto.repo.schema.dump_字段中的匿名fn/6/5

创建
子类别时如何插入
类别id

提前谢谢

这可能有效:

import Ecto.Changeset
parent = Repo.get!(Category, category_id)
subcategory = cast(%Subcategory{}, %{name: name})
              |> put_assoc(:category, parent) 
              |> Repo.insert!
这可能会奏效:

import Ecto.Changeset
parent = Repo.get!(Category, category_id)
subcategory = cast(%Subcategory{}, %{name: name})
              |> put_assoc(:category, parent) 
              |> Repo.insert!

如果要进行测试,您会注意到
category\u id
是一个字符串。当您尝试使用类似于
Repo.get/3的方法在数据库中查找一个值时,这是正常的,但不幸的是,当尝试插入原始值时,这将是不正常的

但是,您应该能够执行类似于
String.to\u integer(category\u id)
的操作,并且您可以很好地插入它

因此,您的最终插入行如下所示

changeset = 
  Subcategory.changeset(%Subcategory{name: name, 
                                     category_id: String.to_integer(category_id)})
  |> Repo.insert()
正如@Dogbert在注释中指出的,您可以让changeset函数处理转换

changeset = 
  Subcategory.changeset(%Subcategory{}, %{name: name, category_id: category_id})
  |> Repo.insert()

这不仅有利于处理整数类型。

如果要进行测试,您会注意到
类别id
是一个字符串。当您尝试使用类似于
Repo.get/3的方法在数据库中查找一个值时,这是正常的,但不幸的是,当尝试插入原始值时,这将是不正常的

但是,您应该能够执行类似于
String.to\u integer(category\u id)
的操作,并且您可以很好地插入它

因此,您的最终插入行如下所示

changeset = 
  Subcategory.changeset(%Subcategory{name: name, 
                                     category_id: String.to_integer(category_id)})
  |> Repo.insert()
正如@Dogbert在注释中指出的,您可以让changeset函数处理转换

changeset = 
  Subcategory.changeset(%Subcategory{}, %{name: name, category_id: category_id})
  |> Repo.insert()

这不仅有利于处理整数类型。

或者让
变更集/2
处理转换:
子类别。变更集(%Subcategory{},%%{name:name,category\u id:category\u id})
。正如@Dogbert所指出的,让变更集处理它会更好。特别是因为您以后可能不会一直处理整数id。或者让
changeset/2
处理转换:
Subcategory.changeset(%Subcategory{},%%{name:name,category\u id:category\u id})
。正如@Dogbert所指出的,让变更集处理它会更好。特别是因为您以后可能不会一直处理整数ID。不幸的是,这将调用数据库两次。一次获取父级,然后再次插入记录。不幸的是,这将调用数据库两次。一次抓取父项,另一次插入记录。