dimitarvp

dimitarvp

Ecto.Changeset.cast with schemaless types: where are all possible types documented?

Hello,
I am trying to cast data for which I specify types dynamically at runtime. In my particular case I’d like to validate that a single field is an array of string-keyed maps with single key/value both of which are strings, and the value should be one of a strict set of strings.

It’s about casting a standardised (in our company) sorting parameters passed to our Phoenix controllers.

The Phoenix parameters format goes like this:

%{
  sort: [ %{"birthdate" => "desc"}, %{"inserted_at" => "asc"} ]
  # all other parameters
}

(This is achieved by sending an HTTP query like so: ?sort[][birthdate]=desc&sort[][inserted_at]=asc)

At the moment I am doing this:

fields = [:sort]
params = %{"sort" => [%{"birthdate" => "desc"}, %{"inserted_at" => "desc"}]}
types = %{sort: {:array, :map}}
Ecto.Changeset.cast({%{}, types}, params, fields)

And it works (meaning the resulting changeset is valid).

However, I wonder if there’s a way to achieve finer-grained control of the type of the sort key. I blindly tried this: types = %{sort: {:array, {:map, :string}}} and it also worked, but to be completely honest I have no idea why. :003:

Is there a way to achieve this finer-grained type control when casting with Ecto’s Changeset? If so, where is it documented?

Marked As Solved

LostKobrakai

LostKobrakai

The docs start here: https://hexdocs.pm/ecto/3.1.7/Ecto.Schema.html#module-primitive-types
Wherever you read inner_type you can nest any other type available, which is what makes {:array, {:map, :string}} possible.

Edit:

I’d also not really make the casting to strict, because all you get as error would be is invalid. Rather make casting ensure you get a known format of data and let other validation steps validate the details with proper error messages.

Also Liked

LostKobrakai

LostKobrakai

As keys are always in “danger” of being serialized to strings (because they’re external to the VM when stored in a db) it means {:map, :string} is a map of :string values.

dimitarvp

dimitarvp

Thank you. But what does it represent really? A map with string keys? With string values? Or both?

Really good advice, appreciate it. How would you go about doing it?

Where Next?

Popular in Questions Top

dotdotdotPaul
Okay, I'm having a heck of a time trying to figure out how to best handle the validation of belongs_to associations in Ecto. I'm sure I'...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
quazar
How to set Jason to encode all fields in ecto schema, I don’t care about security and implementing only is taking long list of attributes...
New
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
mgjohns61585
Could someone help me? I'm making my first elixir program, number guessing game. I can't figure out how to convert the user's guess from ...
New
LegitStack
I’m trying to make a websocket server in Phoenix or raw Elixir. I heard about gun, I think I could use cowboy, but since I’m not that sma...
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New

Other popular topics Top

JDanielMartinez
Hi! May someone helps me, please! I have two apps into an umbrella project: the first one is Database, which manages queries, and the se...
New
itssasanka
Hi all, Trying to get some more clarity over utc_datetime and naive_datetime for Ecto: https://hexdocs.pm/ecto/Ecto.Schema.html#module-...
New
ycv005
I have followed this StackOverflow post to install the specific version of Erlang. And When I am running mix ecto.setup then getting fol...
New
fireproofsocks
I’m working on defining a simple Ecto schema for a table (in PostGres), but I don’t see where I can define a column as NOT NULL. Conside...
New
script
If I have a string “1000 cfu/ml” . I want to remove the characters and / and space . So the string is like this "1000" What is the ...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New

We're in Beta

About us Mission Statement