使用ecto预加载所有链接的记录


木木
2025-03-11 01:38:48 (10天前)


我有链表的结构类型

defmodule Data.Record do
使用Data.Web,:model

alias Data。{Record,Repo}

架构“记录”做
字段(:date_start,:date)
字段(:date_end,:date)


2 条回复
  1. 0# 求赞有赞必回 | 2019-08-31 10-32



    嗯,最(脏)

    解决方法

    会是这样的。它构建了参数

    preload

    达到一定深度:




    1. def preload_args(relation, max_level \ 50) do
      preload_args(relation, max_level - 1, relation)
      end

    2. 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

    3. </code>


    要使用它:




    1. Repo.preload record, Record.preload_args(:changed_to)

    2. </code>


    这会预先加载

    :changed_to

    关系到一定程度或直到没有更多。当然,这不是您真正想要使用的解决方案,因为它对每个预加载执行查询,而您不知道链预先存在多长时间,可能比50步更长。



    (请不要为此代码/建议烤我,你特别要求

    解决方法

    太。 ;)



    我觉得

    关于’封闭表’的评论

    通过Aetherus指出的

    本文

    可能会引导您找到更好的解决方案。它还强化了我的假设,即您不需要首先存储父级和子级ID,仅使用parent_id就足够了。这样也可以更容易地插入新记录:您也不需要更新父记录。


登录 后才能参与评论