如何使用通道插入外键 ID?
How can I insert foreign key id through using channel?
我有表格,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
如何在创建subcategory
时插入category_id
?
提前致谢..
这可能有效:
import Ecto.Changeset
parent = Repo.get!(Category, category_id)
subcategory = cast(%Subcategory{}, %{name: name})
|> put_assoc(:category, parent)
|> Repo.insert!
如果您进行测试,您会注意到 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()
这样做的好处是不仅可以处理整数类型。
我有表格,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
如何在创建subcategory
时插入category_id
?
提前致谢..
这可能有效:
import Ecto.Changeset
parent = Repo.get!(Category, category_id)
subcategory = cast(%Subcategory{}, %{name: name})
|> put_assoc(:category, parent)
|> Repo.insert!
如果您进行测试,您会注意到 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()
这样做的好处是不仅可以处理整数类型。