如何通过使用通道插入外键ID?

时间:2017-02-02 13:51:45

标签: elixir phoenix-framework ecto

我有表格CategorySubcategory

Category有许多subcategoriesSubcategory属于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

所以基本上,我想做的是创建namecategory_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

提前致谢..

2 个答案:

答案 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!