Drops.Relation.Plugins.Ecto.Query (drops_relation v0.1.0)
View SourcePlugin for defining custom Ecto queries within relation modules.
This plugin provides the defquery
macro that allows defining custom query functions
that return relation structs with the queryable set to the result of the query block.
Architecture
For each relation module that defines queries, this plugin creates a dedicated
QueryBuilder module (e.g., MyRelation.QueryBuilder
) that contains the actual
query functions with Ecto.Query
imported once at the module level. The relation
module then delegates to these QueryBuilder functions.
Usage
defmodule MyApp.Users do
use Drops.Relation, repo: MyApp.Repo
schema("users", infer: true)
defquery active() do
from(u in relation(), where: u.active == true)
end
defquery by_role(role) when is_binary(role) do
from(u in relation(), where: u.role == ^role)
end
defquery recent(days \\ 7) do
cutoff = DateTime.utc_now() |> DateTime.add(-days, :day)
from(u in relation(), where: u.inserted_at >= ^cutoff)
end
end
# This creates:
# - MyApp.Users.active() -> delegates to MyApp.Users.QueryBuilder.active()
# - MyApp.Users.QueryBuilder module with Ecto.Query imported
# - relation() function available in query blocks
# Usage examples:
active_users = MyApp.Users.active() |> MyApp.Users.all()
admin_users = MyApp.Users.by_role("admin") |> MyApp.Users.all()
recent_users = MyApp.Users.recent(30) |> MyApp.Users.all()
The relation()
function within the query block returns the relation module, allowing
you to reference the current relation in your Ecto queries.