Packages
ecto
0.2.3
3.14.1
3.14.0
3.13.6
3.13.5
3.13.4
3.13.3
3.13.2
3.13.1
3.13.0
3.12.6
3.12.5
3.12.4
3.12.3
3.12.2
3.12.1
3.12.0
3.11.2
3.11.1
3.11.0
3.10.3
3.10.2
3.10.1
3.10.0
3.9.6
3.9.5
3.9.4
3.9.3
3.9.2
3.9.1
3.9.0
3.8.4
3.8.3
3.8.2
3.8.1
3.8.0
3.7.2
3.7.1
3.7.0
3.6.2
3.6.1
3.6.0
3.5.8
3.5.7
3.5.6
3.5.5
3.5.4
3.5.3
3.5.2
3.5.1
3.5.0
3.5.0-rc.1
3.5.0-rc.0
3.4.6
3.4.5
3.4.4
3.4.3
3.4.2
3.4.1
3.4.0
3.3.4
3.3.3
3.3.2
3.3.1
3.3.0
3.2.5
3.2.4
3.2.3
3.2.2
3.2.1
3.2.0
3.1.7
3.1.6
3.1.5
3.1.4
3.1.3
3.1.2
3.1.1
3.1.0
3.0.9
3.0.8
3.0.7
3.0.6
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
3.0.0-rc.1
3.0.0-rc.0
2.2.12
2.2.11
2.2.10
2.2.9
2.2.8
2.2.7
2.2.6
2.2.5
2.2.4
2.2.3
2.2.2
2.2.1
2.2.0
2.2.0-rc.1
2.2.0-rc.0
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.1.0-rc.5
2.1.0-rc.4
2.1.0-rc.3
2.1.0-rc.2
2.1.0-rc.1
2.1.0-rc.0
2.0.6
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
2.0.0-rc.6
2.0.0-rc.5
2.0.0-rc.4
2.0.0-rc.3
2.0.0-rc.2
2.0.0-rc.1
2.0.0-rc.0
2.0.0-beta.2
2.0.0-beta.1
2.0.0-beta.0
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.16.0
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.1
0.13.0
0.12.1
0.12.0
0.12.0-rc
0.11.3
0.11.2
0.11.1
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
0.9.0
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.0
0.5.1
0.5.0
0.4.0
0.3.0
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.0
A toolkit for data mapping and language integrated query for Elixir
Current section
Files
Jump to
Current section
Files
lib/ecto/model.ex
defmodule Ecto.Model do
@moduledoc """
Models are Elixir modules with Ecto-specific behaviour.
This module is an "umbrella" module that adds a bunch of functionality
to your module:
* `Ecto.Model.Schema` - provides the API necessary to define schemas;
* `Ecto.Model.Callbacks` - to be implemented;
* `Ecto.Model.Validations` - helpers for validations;
By using `Ecto.Model` all the functionality above is included,
but you can cherry pick the ones you want to use.
"""
@doc false
defmacro __using__(_opts) do
quote do
use Ecto.Model.Schema
use Ecto.Model.Validations
end
end
@type t :: map
@key_assocs [Ecto.Reflections.HasOne, Ecto.Reflections.HasMany]
@doc """
Returns the model's primary key.
Raises `Ecto.NoPrimaryKey` if model has no primary key.
"""
@spec primary_key(t) :: any
def primary_key(%{__struct__: module} = model) do
if pk_field = module.__schema__(:primary_key) do
Map.get(model, pk_field)
else
raise Ecto.NoPrimaryKey, model: model
end
end
@doc """
Sets the model's primary key.
Raises `Ecto.NoPrimaryKey` if model has no primary key.
"""
@spec put_primary_key(t, any) :: t
def put_primary_key(%{__struct__: module} = model, id) do
unless pk_field = module.__schema__(:primary_key) do
raise Ecto.NoPrimaryKey, model: model
end
fields = module.__schema__(:associations)
model = Map.put(model, pk_field, id)
Enum.reduce(fields, model, fn field, model ->
if (refl = module.__schema__(:association, field)) && refl.__struct__ in @key_assocs do
Map.update!(model, refl.field, &(&1.__assoc__(:primary_key, id)))
else
model
end
end)
end
@doc """
Scopes a query to the local model.
Shorthand for `from(var in __MODULE__, ...)`.
"""
defmacro scoped(field, opts) do
quote do
from unquote(field) in __MODULE__, unquote(opts)
end
end
end