我在 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}
])
可以限制预加载记录的数量,但它需要不止一个衬垫,并且可能不像您希望或期望的那样灵活:
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)])