mathieuprog
Polymorphic_embed - polymorphic Embeds in Ecto
Hello ![]()
I published a library that brings support for polymorphic/dynamic embeds in Ecto.
Ecto’s embeds_one macro requires a specific schema module to be specified. This library removes this restriction by dynamically determining which schema to use, based on data to be stored (from a form or API) and retrieved (from the data source).
Example use case:
Say you have a Reminder schema. A reminder has a set date and text, but also specific fields whether it is an email reminder or sms reminder. Instead of adding and mixing all the email- and sms-related fields together in the Reminder schema, where one set of fields or the other are null values, you can add a polymorphic embed, only containing the relevant sms or email fields. The polymorphic embed also supports its own changeset validations.
See example code and usage in Readme file ![]()
https://github.com/mathieuprog/polymorphic_embed
Inspired by ecto_poly library.
Most Liked
mathieuprog
-
Support for LiveView forms has been added thanks to the quality contribution of Mathias!
-
Support for primary keys has been added
The latter may introduce breaking changes, therefore Polymoprhic Embed version has been bumped to 2.0.0
Migration from 1.x to 2.x is easy:
- Make sure that every existing polymorphic
embedded_schemacontains the setting@primary_key false
mathieuprog
I imagine this is a pretty common need, and that many codebases would either have a schema with sets of null values, or end up having their own custom Ecto type implementations.
This library indeed provides a custom Ecto Type that determines the right embed schema to use, based on params to cast. Nice thing is, you can tell PolymorphicEmbed that the presence of specific params identifies a certain schema – no need for a “type” field in the params:)
In addition to the advantages that a library offers (get rid of boilerplate code in the app, reusable code across projects, bugfixes, …), it comes with some nice features:
- As mentioned, detect which types to use for the data being
cast-ed, based on fields present in the data (no need for a type field in the data) - Run changeset validations when a
changeset/2function is present (when absent, the library will introspect the fields to cast) - Support for nested polymorphic embeds
- Support for nested
embeds_one/embeds_manyembeds - Display form inputs for polymorphic embeds in Phoenix templates
Added those features in the Readme file.
mathieuprog
Version 3.0.0 has been released!
We now encourage the use of polymorphic_embeds_one/2 and polymorphic_embeds_many/2 macros to define your polymorphic embeds.
If you’re curious as to why: a field containing a polymorphic list of embeds defaulted to nil before version 3. To follow embeds_many/3 we should default to []. This can only be done by forcing the :default option of the field/3 to [] (ie we can’t configure this in the Type). I added the new macros in order to set these kind of defaults setting up the field for the polymorphic embeds.
Thanks to Alexandre @Matsa59 for his contribution which led to this update!
Last Post!
munksgaard
This seems to work the first time I select something. But if I then change my selection, it doesn’t actually change anything. Even in my handle_event I’m not seeing the updated selection.
Popular in Announcing
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #hex
- #security









