mathieuprog
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.
Trending in Announcing
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixirconf-us
- #ai
- #blog-post
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #hex
- #security
- #metaprogramming











First Post!- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
thomas.fortes
Awesome, I’ve been working exactly with this problem this past week, my solution was built with an Ecto custom type, it works perfectly, but there’s a lot of boilerplate…
From the docs it seems like it will be almost a plug and play with just some minor adjustments, will open a branch and try it
Edit: Yeah, looking at the source of the lib it does what I was doing manually with a custom type, it took zero modifications in the code aside of changing the field type in the schema and configuring the lib, so far all the tests passed.
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:
embedded_schemacontains the setting@primary_key falsemathieuprog
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
PolymorphicEmbedthat 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:
cast-ed, based on fields present in the data (no need for a type field in the data)changeset/2function is present (when absent, the library will introspect the fields to cast)embeds_one/embeds_manyembedsAdded those features in the Readme file.
mathieuprog
Version 3.0.0 has been released!
We now encourage the use of
polymorphic_embeds_one/2andpolymorphic_embeds_many/2macros to define your polymorphic embeds.If you’re curious as to why: a field containing a polymorphic list of embeds defaulted to
nilbefore version 3. To followembeds_many/3we should default to[]. This can only be done by forcing the:defaultoption of thefield/3to[](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_eventI’m not seeing the updated selection.