PhoenixBricks.Scopes (phoenix_bricks v0.3.0) View Source

Defines a common interface for adding scopes to a Schema

Examples

defmodule RecordQuery do
  use ExBricks.Scopes, schema: Record
end

It provides you a method scope that improve the empty scope of provided schema with additional scopes.

scope/0 returns the empty scope

iex> RecordQuery.scope()
iex> Record

With scope/1 you can provide a list of scopes that improve the starting scope

iex> scopes = [field1: {:eq, "value"}, field2: {:gte, 42}]
iex> RecordQuery.scope(scopes)
iex> #Ecto.Query<from r0 in Record, where: r0.field1 == ^"value" and r0.field2 >= 42>

If you need to improve an existing Ecto.Query you can use scope/2

iex> starting_scope = from(r in Record, where: r.field1 == "value")
iex> scopes = [field2: {:gte, 42}]
iex> RecordQuery.scope(starting_scope, scopes)
iex> #Ecto.Query<from r0 in Record, where: r0.field1 == ^"value" and r0.field2 >= 42>

Built-in scopes

:eq

iex> RecordQuery.scope(field: {:eq, "value"})
iex> #Ecto.Query<from r0 in Record, where: r0.fields == ^"value">

:gt

iex> RecordQuery.scope(field: {:gt, "value"})
iex> #Ecto.Query<from r0 in Record, where: r0.fields > ^"value">

:lt

iex> RecordQuery.scope(field: {:lt, "value"})
iex> #Ecto.Query<from r0 in Record, where: r0.fields < ^"value">

:gte

iex> RecordQuery.scope(field: {:gte, "value"})
iex> #Ecto.Query<from r0 in Record, where: r0.fields >= ^"value">

:lte

iex> RecordQuery.scope(field: {:lte, "value"})
iex> #Ecto.Query<from r0 in Record, where: r0.fields <= ^"value">

:neq

iex> RecordQuery.scope(field: {:neq, "value"})
iex> #Ecto.Query<from r0 in Record, where: r0.fields != ^"value">

:matches

iex> RecordQuery.scope(field: {:matches, "value"})
iex> #Ecto.Query<from r0 in Record, where: ilike(r0.field, ^"%value%")>

Customize scopes

If you need to define more comprehensive scopes you can improve the query adding new apply_scope/2 methods

defmodule RecordQuery, do
  use ExBricks.Scopes, schema: Record

  defp apply_scope(query, {:name_matches, "value"}) do
    query
    |> apply_scope(:name, {:matches, "value"})
  end

  defp apply_scope(query, {:published}) do
    query
    |> where([p], p.status == "published")
  end
end

iex> RecordQuery.scope(:published, name_matches: "value")
iex> #Ecto.Query<from r0 in Record, where: r0.status == "published" and ilike(r0.name, ^"%value%")>