递归加载所有子类别

时间:2018-03-19 17:16:38

标签: elixir phoenix-framework ecto

我想预加载所有类别子类别。

示例:

-> Sport
    -> Football
        -> Man
        -> Woman
    -> Handbal
        -> Man
        -> Woman

到目前为止,我设法只预装了第一个孩子,这是我正在使用的代码:

schema "categories" do
    has_many :subCategories, Category, foreign_key: :parent_id

    ------

    Repo.all from category in Category,
        left_join: subCategories in assoc(category, :subCategories),
        preload: [subCategories: subCategories],
        where: is_nil(category.parent_id)

我找到了一种如何加载所有子类别的方法,但它会产生太多的SQL查询(http://tensiondriven.github.io/posts/recursively-load-self-referential-association-using-ecto

1 个答案:

答案 0 :(得分:1)

这就是我以前用来预加载类别和子类别的方法。 希望有所帮助

Repo.preload([:category1, :category2, category3: [subcategory1: [subcat1: :subcat2]]])

但是我建议在SQL中使用连接,因为preload会为每个关联分配数据库。加入只需一次db旅行即可。