Я планирую использовать Ecto
Schema
и Changeset
только для проверки, не сохраняя что-либо в базе данных и пытаясь выяснить, следует ли мне использовать Ecto.Schema.schema/2
или Ecto.Schema.embedded_schema/1
.Согласно документам, единственное различие между ними заключается в том, что " Встроенная схема не требует имени источника и не содержит поля метаданных. "
Итак, я пошел с embedded_schema/1
, работает чудесно, но это заставило меня задуматься для чего именно используются метаданные? Ecto.Schema.Metadata
документы не сильно помогают уточнить это:
Хранит метаданные структуры.
Поля:
- state - состояние во время жизни структуры, одно из: built,: загружен,: удалено
- source - источник для схемы вместе с префиксом запроса, по умолчанию {nil, "source"}
- context - контекст, хранящийся в базе данных
Выполнение поискапоскольку " meta " не дает результатов, а "metadata" возвращается с одним результатом в Ecto.Schema
docs , что находится в приведенной выше строке для embedded_schema/1
.
ОБНОВЛЕНИЕ
Забыл, что скоро выйдет Ecto 3 и документацию Hexdocs явсе еще для Ecto 2.2.11.Нашли обновленные Metadata
документы в источнике, хотя они более многословны:
Stores metadata of a struct.
## State
The state of the schema is stored in the `:state`
field and allows following values:
* `:built` - the struct was constructed in
memory and is not persisted
to database yet;
* `:loaded` - the struct was loaded from database
and represents persisted data;
* `:deleted` - the struct was deleted and no longer
represents persisted data.
## Source
The `:source` tracks the (table or collection) where
the struct is or should be persisted to.
## Prefix
Tracks the source prefix in the data storage.
## Context
The `:context` field represents additional state some
databases require for proper updates of data. It is
not used by the built-in adapters of `Ecto.Adapters.Postres`
and `Ecto.Adapters.MySQL`.
## Schema
The `:schema` field refers the module name for the
schema this metadata belongs to.
( Обновленные Schema
документы также разрешили мою дилемму, приведенную выше:
An Ecto schema is used to map any data source into an Elixir struct.
The definition of the schema is possible through two main APIs:
`schema/2` and `embedded_schema/1`.
`schema/2` is typically used to map data from a persisted source,
usually a database table, into Elixir structs and vice-versa. For
this reason, the first argument of `schema/2` is the source (table)
name. Structs defined with `schema/2` also contain a `__meta__` field
with metadata holding the status of the struct, for example, if it
has been built, loaded or deleted.
On the other hand, `embedded_schema/1` is used for defining schemas
that are embedded in other schemas or only exist in-memory. For example,
you can use such schemas to receive data from a command line interface
and validate it, without ever persisting it elsewhere. Such structs
do not contain a `__meta__` field, as they are never persisted.
)