【问题标题】:How can I insert foreign key id through using channel?如何通过使用通道插入外键 ID?
【发布时间】:2017-02-02 22:30:24
【问题描述】:

我有桌子,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?

提前谢谢..

【问题讨论】:

    标签: elixir phoenix-framework ecto


    【解决方案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 在 cmets 中指出的那样,您可以让变更集函数处理转换。

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

    这不仅适用于整数类型。

    【讨论】:

    • 或者让changeset/2处理转换:Subcategory.changeset(%Subcategory{}, %{name: name, category_id: category_id})。
    • 正如@Dogbert 指出的那样,让变更集处理它会更好。特别是因为您将来可能不会总是处理整数 ID。
    【解决方案2】:

    这可能有效:

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

    【讨论】:

    • 不幸的是,这将调用数据库两次。一次抓取父级,再次插入记录。
    猜你喜欢
    • 2020-06-20
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    相关资源
    最近更新 更多