Ecto.Model
Models are Elixir modules with Ecto-specific behaviour.
This module provides some convenience functions for working with models.
Using
When used, this module works as 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
- provides lifecycle callbacks;Ecto.Model.Validations
- helpers for validations;
By using Ecto.Model
all the functionality above is included
and both Ecto.Model
and Ecto.Query
modules are imported.
However, you can avoid using Ecto.Model
altogether in favor
of cherry picking the functionality above.
Importing
You may want to import this module in contexts where you are working with different models. For example, in a web application, you may want to import this module into your plugs to provide conveniences for assigning, building and accessing model information.
Summary↑
assoc(model_or_models, assoc) | Builds a query for the association in the given model or models |
build(struct, assoc) | Builds a structs from the given |
primary_key(struct) | Returns the model primary key value |
Types ↑
t :: %{}
Functions
Builds a query for the association in the given model or models.
Examples
In the example below, we get all comments associated to the given post:
post = Repo.get Post, 1
Repo.all assoc(post, :comments)
assoc/2
can also receive a list of posts, as long as the posts are
not empty:
posts = Repo.all from p in Post, where: is_nil(p.published_at)
Repo.all assoc(posts, :comments)
Builds a structs from the given assoc
in model
.
Examples
If the relationship is a has_one
or has_many
and
the key is set in the given model, the key will automatically
be set in the built association:
iex> post = Repo.get(Post, 13)
%Post{id: 13}
iex> build(post, :comment)
%Comment{id: nil, post_id: 13}
Note though it doesn't happen with belongs to cases, as the key is often the primary key and such is usually generated dynamically:
iex> comment = Repo.get(Post, 13)
%Comment{id: 13, post_id: 25}
iex> build(comment, :post)
%Post{id: nil}
Specs:
- primary_key(t) :: any
Returns the model primary key value.
Raises Ecto.NoPrimaryKeyError
if model has no primary key.