lorenzomar

lorenzomar

Hi there!
I’m in the situation where I’m receiving a struct which is also an Ecto Schema (wich embedded_one/many other schemas). To be more precise it is a Commanded command.
Sometimes I may not be in control of how the command was built before dispatching it so I would implement a middleware that validate the command before and pass to the next layer only if everything is ok.

Passing the command to the changeset function doesn’t work since it is not a map (itself or the embedded structs).

Currently I implemented a changeset function like this:

defmodule MySchema do
   ....

   def changeset(%__MODULE__{} = schema, %__MODULE__{} = attrs) do
      changeset(schema, Map.from_struct(attrs))
   end

   def changeset(%__MODULE__{} = schema, attrs) do
      # all changeset stuff: cast, validate, ...
   end
end

All the embedded schemas implement a changeset like that. In this way it recursively transform a struct in a map before executing real changeset functionalities.

It works, but it seems like a lot of work.

Any suggestion? Do you know any better approach? maybe can I approach things differently?

Any help is really welcome.

Thanks!

Showing Posts 1 to 1

LostKobrakai

LostKobrakai

What you’re running into is twofold.

Ecto.Changeset.cast doesn’t allow non map inputs. That’s by design because cast is meant to deal with external input – as in having uncontrolled values, unknown types of value represenation and such. Stuff like json or form input. When you got a struct that’s very unlikely external input like that anymore. There are other API more suited for the job like put_change/3 or change/2.

The other part is that changeset validations only validate changes, not existing values. You can force values to become changes with e.g. force_change/3 or some other APIs can also optionally force changes on a changeset.

Generally I’d however wonder why you’re validating things in the middle of handling a command and not at creation. A command should likely adhere to a contract shared between parties to be enforced at creation time.

— All posts loaded —

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
ryanwinchester
apply_graft/2 doesn’t rewrite an add_many sub-workflow’s deps on an add step. Grafted jobs cancel with “upstream job was deleted” Version...
New

Other Trending Topics Top

JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Dmk
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New

Latest on Elixir Forum

Elixir Forum

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews