我正在尝试对已加载关联的数据进行分页。
在我的控制器中,这有效:
def index(conn, _params) do
products = Product
|> Repo.all
|> Repo.preload(:category)
render(conn, "index.html", products: products)
end
这也有效:
def index(conn, params) do
{products, kerosene} = Product
|> Repo.paginate(params)
render(conn, "index.html", products: products, kerosene: kerosene)
end
但组合它们会产生argument error on line |> Repo.paginate(params)
def index(conn, params) do
{products, kerosene} = Product
|> Repo.all
|> Repo.preload(:category)
|> Repo.paginate(params)
render(conn, "index.html", products: products, kerosene: kerosene)
end
如果我放弃行|> Repo.all
,它会产生:
no function clause matching in Ecto.Repo.Preloader.preload/4" on line |> Repo.preload(:category)
答案 0 :(得分:1)
假设您正在使用Kerosene,Repo.paginate
期望查询作为参数,而Repo.all |> Repo.paginate
则返回结构列表。您可以使用Ecto.Query.preload
或使用带有preload属性的from
创建查询,以生成一个在运行时自动预加载的查询。
{products, kerosene} =
Product
|> Ecto.Query.preload(:category)
|> Repo.paginate(params)
# or
{products, kerosene} =
from(p in Product, preload: :category)
|> Repo.paginate(params)