Packages

A set of convenient extensions for developing services with Elixir/Phoenix

Current section

Files

Jump to
elixir_extensions lib ecto query_ext.ex
Raw

lib/ecto/query_ext.ex

defmodule ElixirExtensions.Ecto.QueryExt do
@moduledoc """
Extend Ecto.Query with some useful functions.
Add this line to your Context module:
import Ecto.Query, warn: false
alias ElixirExtensions.Ecto.QueryExt
"""
import Ecto.Query
@doc """
Limit a the number of results from a query. Can be compined with other queryables
UserQuery.text_search("Kyle") |> QueryExt.limit(query, 5)
"""
def limit(query, limit) do
from(x in query, limit: ^limit)
end
@doc """
Preload associations.
UserQuery.text_search("Kyle") |> QueryExt.preload(:posts) |> Repo.all()
"""
def preload(query, preloads) do
from(x in query,
preload: ^preloads
)
end
@doc """
Construct a where query on the fly. Only works when `use QueryBuilder` is added to the schema file
eg QueryExt.where(Log, %{post_id: 1814, user_id: 24688, user_type: "user"}) |> Repo.all()
"""
def where(query, params) do
Enum.reduce(params, query, fn {key, value}, q ->
QueryBuilder.where(q, {key, value})
end)
end
@doc """
order_by(query, [:name, :population])
order_by(query, [asc: :name, desc_nulls_first: :population])
"""
def order_by(query, order) do
from(x in query, order_by: ^order)
end
@doc "Order by newest first"
def order_newest_first(query) do
from(x in query,
order_by: [desc: x.inserted_at, desc: x.id]
)
end
@doc "Order by oldest first"
def order_oldest_first(query) do
from(x in query,
order_by: [asc: x.inserted_at, asc: x.id]
)
end
end