在 Elixir 中为 Ecto 的 Repo.preload 添加限制选项

问题描述 投票:0回答:1

我在 Elixir 中有一个使用 Ecto 的函数,可以为给定实体预加载关联。当前的实现如下所示:

@spec get(integer() | String.t(), list()) :: t() | nil
def get(id, preloads \\ []) do
  Shop
  |> Repo.get(id)
  |> Repo.preload(preloads)
end

我这样使用它:

      Shop.get(id, [
        :coustomers,
        :products
      ])

有可能做到这样吗?:

  Shop.get(id, [
    :coustomers,
    {:limit,:products,3}
  ])
postgresql elixir ecto
1个回答
0
投票

可以限制预加载记录的数量,但它需要不止一个衬垫,并且可能不像您希望或期望的那样灵活:

products_query = from p in Product, limit: 3, order_by: p.inserted_at

Shop
|> get(id)
|> preload([products: products_query]) 

也许您可以创建一个函数,它接受一个模块和一个数字(作为限制)并返回与上面的

products_query
相同的内容,例如:

def preload_query(module, limit) do
  from a in module, limit: ^limit
end

并用它作为

Shop.get/2
的参数:

Shop.get(id, [:customers, products: preload_query(Product, 3)])
© www.soinside.com 2019 - 2024. All rights reserved.