DEV Community

Discussion on: Create a paginator using Elixir and Phoenix

Collapse
 
smaximov profile image
Sergei Maximov • Edited

If the query you want to paginate already contains a :limit or an :offset clause, you may get wrong results because you would override these clauses when applying pagination. The solution is to use a sub-query. You need to modify execute_query like this:

  defp execute_query(query, page) do
    query
    |> maybe_wrap_in_subquery()
    |> limit(^@results_per_page)
    |> offset((^page - 1) * ^@results_per_page)
    |> Repo.all()
  end

  # no :limit/:offset, so no need to wrap the original query in a subquery
  defp maybe_wrap_in_subquery(%{limit: nil, offset: nil} = query), do: query

  defp maybe_wrap_in_subquery(query), do: subquery(query)
Enter fullscreen mode Exit fullscreen mode