Ecto.Model
Provides convenience functions for defining and working with models.
Using
When used, Ecto.Model
works as an "umbrella" module that adds
common functionality to your module:
use Ecto.Schema
- provides the API necessary to define schemasimport Ecto.Changeset
- functions for building and manipulating changesetsimport Ecto.Model
- functions for working with models and their associationsimport Ecto.Query
- functions for generating and manipulating queries
Plus all the modules existing in Ecto.Model.*
are brought in
too:
use Ecto.Model.Callbacks
- provides lifecycle callbacksuse Ecto.Model.Timestamps
- automatically setinserted_at
andupdated_at
fields declared viaEcto.Schema.timestamps/1
However, you can avoid using Ecto.Model
altogether in favor
of cherry picking any of 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 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 :: %atom{}
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 field.