Packages

Flexible ordering for Ecto schemas. Supports belongs-to, many-to-many, and global sets with fractional indexing for efficient reordering. Integrates with Phoenix LiveView and Sortable.js for drag-and-drop interfaces.

Current section

Files

Jump to
ecto_orderable lib ecto_orderable.ex
Raw

lib/ecto_orderable.ex

defmodule EctoOrderable do
@moduledoc """
Provides ordering for Ecto schemas within well-defined sets.
## Usage
defmodule TodoOrder do
use EctoOrderable,
repo: MyApp.Repo,
schema: Todo,
scope: [:user_id]
end
# Get next order value for a new todo
order = TodoOrder.next_order(user)
Repo.insert!(%Todo{title: "Buy milk", user_id: user.id, position: order})
# Reorder existing items
TodoOrder.move(todo, direction: :up)
TodoOrder.move(todo, between: {id_above, id_below})
See `EctoOrderable.Order` for full documentation and options.
"""
defmacro __using__(opts) do
quote do
use EctoOrderable.Order, unquote(opts)
end
end
end