Packages
ecto
0.2.0
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/associations/has_one.ex
defmodule Ecto.Reflections.HasOne do
@moduledoc """
The reflection record for a `has_one` association. Its fields are:
* `field` - The name of the association field on the model;
* `owner` - The model where the association was defined;
* `associated` - The model that is associated;
* `key` - The key on the `owner` model used for the association;
* `assoc_key` - The key on the `associated` model used for the association;
"""
defstruct [:field, :owner, :associated, :key, :assoc_key]
end
defmodule Ecto.Associations.HasOne do
@moduledoc false
defstruct [:loaded, :target, :name, :primary_key]
end
defmodule Ecto.Associations.HasOne.Proxy do
@moduledoc """
A has_one association.
## Create
A new struct of the associated model can be created with `struct/2`. The
created struct will have its foreign key set to the primary key of the parent
model.
defmodule Post do
use Ecto.Model
schema "posts" do
has_one :permalink, Permalink
end
end
post = put_primary_key(%Post{}, 42)
struct(post.permalink, []) #=> %Permalink{post_id: 42}
## Reflection
Any association module will generate the `__assoc__` function that can be
used for runtime introspection of the association.
* `__assoc__(:loaded, assoc)` - Returns the loaded entities or `:not_loaded`;
* `__assoc__(:loaded, value, assoc)` - Sets the loaded entities;
* `__assoc__(:target, assoc)` - Returns the model where the association was
defined;
* `__assoc__(:name, assoc)` - Returns the name of the association field on the
model;
* `__assoc__(:primary_key, assoc)` - Returns the primary key (used when
creating a an model with `new/2`);
* `__assoc__(:primary_key, value, assoc)` - Sets the primary key;
* `__assoc__(:new, name, target)` - Creates a new association with the given
name and target;
"""
@not_loaded :ECTO_NOT_LOADED
require Ecto.Associations
Ecto.Associations.defproxy(Ecto.Associations.HasOne)
@doc false
def __struct__(params \\ [], proxy(target: target, name: name, primary_key: pk_value)) do
refl = target.__schema__(:association, name)
fk = refl.assoc_key
struct(refl.associated, [{fk, pk_value}] ++ params)
end
@doc """
Returns the associated struct. Raises `AssociationNotLoadedError` if the
association is not loaded.
"""
def get(proxy(loaded: @not_loaded, target: target, name: name)) do
refl = target.__schema__(:association, name)
raise Ecto.AssociationNotLoadedError,
type: :has_one, owner: refl.owner, name: name
end
def get(proxy(loaded: loaded)) do
loaded
end
@doc """
Returns `true` if the association is loaded.
"""
def loaded?(proxy(loaded: @not_loaded)), do: false
def loaded?(_), do: true
@doc false
Enum.each [:loaded, :target, :name, :primary_key], fn field ->
def __assoc__(unquote(field), record) do
proxy([{unquote(field), var}]) = record
var
end
end
@doc false
Enum.each [:loaded, :primary_key], fn field ->
def __assoc__(unquote(field), value, record) do
proxy(record, [{unquote(field), value}])
end
end
def __assoc__(:new, name, target) do
proxy(name: name, target: target, loaded: @not_loaded)
end
end
defimpl Inspect, for: Ecto.Associations.HasOne do
import Inspect.Algebra
def inspect(%{name: name, target: target}, opts) do
refl = target.__schema__(:association, name)
associated = refl.associated
references = refl.key
foreign_key = refl.assoc_key
kw = [
name: name,
target: target,
associated: associated,
references: references,
foreign_key: foreign_key
]
concat ["#Ecto.Associations.HasOne<", Inspect.List.inspect(kw, opts), ">"]
end
end