我有链表的结构类型
defmodule Data.Record do 使用Data.Web,:model
alias Data。{Record,Repo}
架构“记录”做 字段(:date_start,:date) 字段(:date_end,:date) …
嗯,最(脏) 解决方法 会是这样的。它构建了参数 preload 达到一定深度:
preload
def preload_args(relation, max_level \\ 50) do preload_args(relation, max_level - 1, relation) end defp preload_args(_relation, level, acc) when level <= 0, do: acc defp preload_args(relation, level, acc) do preload_args(relation, level - 1, [{relation, acc}]) end
要使用它:
Repo.preload record, Record.preload_args(:changed_to)
这会预先加载 :changed_to 关系到一定程度或直到没有更多。当然,这不是您真正想要使用的解决方案,因为它对每个预加载执行查询,而您不知道链预先存在多长时间,可能比50步更长。
:changed_to
(请不要为此代码/建议烤我,你特别要求 解决方法 太。 ;)
我觉得 关于'封闭表'的评论 通过Aetherus指出的 本文 可能会引导您找到更好的解决方案。它还强化了我的假设,即您不需要首先存储父级和子级ID,仅使用parent_id就足够了。这样也可以更容易地插入新记录:您也不需要更新父记录。