Elixir 通过通道更新变更集。它不会更新。。

Elixir 通过通道更新变更集。它不会更新。。,elixir,phoenix-framework,Elixir,Phoenix Framework,我有子类别和类别的表格子类别属于类别,类别有许多子类别 在类别表中,有名称和子类别,它们是布尔值 我想做的是,当用户创建一个子类别时,它会检查是否有未分配的食物(这意味着食物没有分配给任何子类别),如果没有任何未分配的食物,它会将类别表的子类别值更新为真 def handle_in("create:subcategory", %{"name" => name, "category_id" => category_id}, socket) do changeset = Subca

我有
子类别
类别
的表格<代码>子类别属于
类别
类别
有许多
子类别

类别
表中,有
名称
子类别
,它们是布尔值

我想做的是,当用户创建一个子类别时,它会检查是否有未分配的食物(这意味着
食物
没有分配给任何子类别),如果没有任何未分配的食物,它会将
类别
表的
子类别
值更新为

def handle_in("create:subcategory", %{"name" => name, "category_id" => category_id}, socket) do 

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

unassignedfood = from(f in Myapp.Food, where: f.category_id == ^category_id and is_nil(f.subcategory_id), select: map(f, [:id, :name])) |> Repo.all 

 if unassignedfood == nil do
  category = Repo.get!(Myapp.Category, category_id)
 |> Myapp.Category.changeset(%{subcategory: true})
 |> Repo.update!
else
 category = Repo.get!(Myapp.Category, category_id)
 |> Myapp.Category.changeset(%{subcategory: false})
 |> Repo.update 
end

 subcategories = from(p in Myapp.Subcategory, select: map(p, [:id, :name, :category_id])) |> Repo.all
 response = %{subcategories: subcategories}

 broadcast! socket, "subcategories:updated", response

 {:noreply, socket}
end
所以我做了上面这样的代码,如果没有未分配的食物,将
类别的
子类别
值更改为

def handle_in("create:subcategory", %{"name" => name, "category_id" => category_id}, socket) do 

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

unassignedfood = from(f in Myapp.Food, where: f.category_id == ^category_id and is_nil(f.subcategory_id), select: map(f, [:id, :name])) |> Repo.all 

 if unassignedfood == nil do
  category = Repo.get!(Myapp.Category, category_id)
 |> Myapp.Category.changeset(%{subcategory: true})
 |> Repo.update!
else
 category = Repo.get!(Myapp.Category, category_id)
 |> Myapp.Category.changeset(%{subcategory: false})
 |> Repo.update 
end

 subcategories = from(p in Myapp.Subcategory, select: map(p, [:id, :name, :category_id])) |> Repo.all
 response = %{subcategories: subcategories}

 broadcast! socket, "subcategories:updated", response

 {:noreply, socket}
end
我检查了没有
未分配的食物
,但它不会更新

这样做对吗??我怎样才能解决这个问题


提前谢谢

Repo.all
返回记录列表,空结果将是
[]
,而不是
nil
,因此如果要检查空响应,需要更改:

if unassignedfood == nil do


如果您只想检查记录是否存在,更有效的方法是使用
Repo.one
limit:1
select:true
,然后检查它是否返回true:

unassignedfood = from(f in Myapp.Food, where: f.category_id == ^category_id and is_nil(f.subcategory_id), limit: 1, select: true) |> Repo.one

if unassignedfood do
  ...
else
  ...
end

Repo.all
返回一个记录列表,空结果将是
[]
,而不是
nil
,因此如果要检查空响应,需要更改:

if unassignedfood == nil do


如果您只想检查记录是否存在,更有效的方法是使用
Repo.one
limit:1
select:true
,然后检查它是否返回true:

unassignedfood = from(f in Myapp.Food, where: f.category_id == ^category_id and is_nil(f.subcategory_id), limit: 1, select: true) |> Repo.one

if unassignedfood do
  ...
else
  ...
end

Repo.all
将永远不会返回
nil
。你的意思是做
未分配的食物=[]
?哦。。。我懂了。我想用
未分配的食物
做的是检查是否有
食物
没有
子类别标识
,或者没有在一个
类别标识
。。。我尝试了
unassignedfood=[]
,结果成功了。谢谢
Repo.all
永远不会返回
nil
。你的意思是做
未分配的食物=[]
?哦。。。我懂了。我想用
未分配的食物
做的是检查是否有
食物
没有
子类别标识
,或者没有在一个
类别标识
。。。我尝试了
unassignedfood=[]
,结果成功了。谢谢