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。不幸的是,这将调用数据库两次。一次获取父级,然后再次插入记录。不幸的是,这将调用数据库两次。一次抓取父项,另一次插入记录。