Elixir 用于选择具有左联接子查询的记录的空白结构

Elixir 用于选择具有左联接子查询的记录的空白结构,elixir,ecto,Elixir,Ecto,我有一些类似的外部结构: defmodule MyApp.ForumCategory do 使用MyApp.Schema “论坛类别”模式 字段:名称,:字符串 字段:最后一个主题,:地图,虚拟:真 字段:last_post,:map,virtual:true 结束 结束 defmodule MyApp.ForumTopic do 使用MyApp.Schema “论坛主题”模式 字段:名称,:字符串 时间戳() 属于:论坛类别,MyApp.ForumCategory 有很多:论坛帖子,MyAp

我有一些类似的外部结构:

defmodule MyApp.ForumCategory do
使用MyApp.Schema
“论坛类别”模式
字段:名称,:字符串
字段:最后一个主题,:地图,虚拟:真
字段:last_post,:map,virtual:true
结束
结束
defmodule MyApp.ForumTopic do
使用MyApp.Schema
“论坛主题”模式
字段:名称,:字符串
时间戳()
属于:论坛类别,MyApp.ForumCategory
有很多:论坛帖子,MyApp.ForumPost
结束
结束
defmodule MyApp.ForumPost do
使用MyApp.Schema
“论坛帖子”模式
字段:文本,:字符串
时间戳()
属于:profile,MyApp.profile
属于:论坛主题,MyApp.ForumTopic
结束
结束
我想做的是检索所有论坛类别的列表,以及它们的最后一个主题和这个主题的最后一篇文章:

。。。
def列表do
主题查询=
论坛主题
|>加入(:内部,[ft],协会中的fp(ft,:论坛帖子))
|>不同([ft],ft.forum\u category\u id)
|>订购人([ft,fp],[desc:ft.forum\u category\u id,desc:fp.inserted\u at])
发帖查询=
发贴控件
|>不同([fp],fp.forum\u topic\u id)
|>订购人([fp],[desc:fp.forum\u topic\u id,desc:fp.inserted\u at])
类别=
穹窿类
|>join(:left,[fc],子查询中的lft(topics\u query),lft.forum\u category\u id==fc.id)
|>join(:left,[fc,lft],子查询中的lfp(posts\u query),lfp.forum\u topic\u id==lft.id)
|>联接(:左,[fc,lft,lfp],在assoc中的lfpp(lfp,:profile))
|>选择([fc,lft,lfp,lfpp],{fc,lft,lfp,lfpp})
|>回购协议
|>枚举映射(&fold\u category\u data/1)
{:好,%{forum_categories:categories}
结束
defp fold_category_数据({fc,nil,nil,nil}),do:fc
defp fold_category_数据({fc,lft,lfp,lfpp})do
足球俱乐部
|>Map.put(:最后一个主题,lft)
|>Map.put(:last_post,%{lfp | profile:lfpp})
结束
...
但我觉得奇怪的是,如果论坛类别没有主题(因此也没有帖子),查询绑定
lft
lfp
未选择为
nil
,而是选择为
ForumTopic
ForumPost
结构,其所有字段都具有
nil
,因此我的折叠功能失败

但是,如果我删除子查询并执行类似操作:

。。。
|>join(:left,[fc],lft-in-ForumTopic,lft.id==最后一个\u-topic\u-id(fc.id))
...
其中,
last\u topic\u id
是一个片段宏,它触发子查询以查找最后一个topic id,然后一切按预期工作,我得到的是
nil
s,而不是空白模式

有人能解释一下为什么事情是这样的吗?最好的解决办法是什么


PS我不喜欢后一个选项,因为它涉及到编写大片段,从SQL性能的角度来看可能要慢得多。

我肯定这可能会直接报告给Ecto。我不是一个日常的外星用户,所以我猜不出为什么这个决定是故意做的,但对我来说,它看起来很像一个bug

解决方法非常简单:

- defp fold_category_data({fc, nil, nil, nil}), do: fc
+ defp fold_category_data(
+   {fc, %ForumTopic{id: nil}, %ForumPost{id: nil}, nil}
+ ), do: fc

是的,映射肯定不是问题,只是想知道它为什么工作,它是如何工作的。我会试着找人看看这是否是个问题。谢谢你的帮助!我绝对建议将问题发布到
exto