Is there a plan to support custom loading for embedded types?

Custom types do not use load/dump when embedded.

Then may use dump if they define embed_as to return :dump, but there is no way to use load or any other mechanism then cast when loading data.

  1. Is there a good reason for this design? The asymmetry in dumping / loading is a bit odd to me.

Moreover the fact that cast has to be called when loading from the DB can be quite inconvenient. While returning :error when casting user data (e.g. from a form) is very useful, if I have invalid data stored in my DB then returning :error result in a raised exception, which is blocking. Moreover, there’s no way to know within cast if I’m loading from the DB or casting user data.

  1. Documentation for load is very misleading, e.g.

There are two situations where this callback is called:

  1. When casting values by Ecto.Changeset
  2. When passing arguments to Ecto.Query

Clearly, this is incomplete and there is an extra situation “3. When loading data in an embedded schema”.

I can propose a PR but would appreciate to know if there’s every a plan to support custom loading for embedded types.

Thank you

1 Like

Maybe try posting this on the Ecto dev group as well.

We can always add a new value to em embed_as, we just need to understand the use case. The reason it was designed like this is because most embedding is done as JSON, which is a lossy format. And PRs to improve the docs are always welcome.

Thank you. I went another way for now, so I’m not 100% confident about my usecase :sweat_smile:. I created a PR for the doc, thanks :heart: