Какова цель "Ecto.Schema.Metadata"?(т. е. поле `__meta__`) - PullRequest
0 голосов
/ 14 октября 2018

Я планирую использовать 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.

)

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Ecto.Schema.Metadata используется исключительно для хранения всей информации, связанной с базой данных.

Как упоминал Хосе в серии сообщений на Ecto 2 → 3 ,

Начиная с Ecto 2.0, все большее число разработчиков и групп используют Ecto для отображения и проверки данных без необходимости в базе данных.Тем не менее, добавление Ecto в ваше приложение все равно принесет большой багаж SQL, такой как адаптеры, песочницы и миграции, которые многие считают смешанным сообщением.

Последнее касается метаданных.

Для Ecto 2 существует практическое правило: если вам нужна таблица DB позади, используйте schema;используйте embedded_schema в противном случае.


Sidenote: Мой общий совет: когда вы хотите что-то понять в двух словах, не читайте документы, читайте код.

0 голосов
/ 14 октября 2018

Поле __meta__ используется Ecto внутренне для хранения метаданных о записи, ассоциациях, если они загружены, устаревших или более.

Описание в документации, которую вы связали, кажется самодостаточным:

Хранит метаданные структуры.

Поля:

  • state - состояние во время жизни структуры, один из :built, :loaded, :deleted
  • source - источник схемы вместе с префиксом запроса, по умолчанию {nil, "source"}
  • context - контекстхранится в базе данных
...