使用预加载的关联分页数据时的参数错误

时间:2017-09-28 12:13:38

标签: ajax elixir phoenix-framework

我正在尝试对已加载关联的数据进行分页。

在我的控制器中,这有效:

  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)

1 个答案:

答案 0 :(得分:1)

假设您正在使用KeroseneRepo.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)