jmurphyweb

jmurphyweb

:default option causes inconsistent behaviour for Ecto.Schema field

I find the :defualt option of Ecto.Schema’s :field function a bit confusing.

From my understanding, passing empty string "" to the cast function is usually equivalent to passing nil.

However, if there is a default: value set, it changes the behaviour and "" param is now treated differently from nil param.

This is demonstrated below:

defmodule A do
  use Ecto.Schema

  schema "a" do
    field(:a, :integer, default: 5)
    field(:b, :integer)
  end
end
iex(1)> changeset = Ecto.Changeset.cast(%A{},  %{"a" => "", "b" => ""}, [:a, :b])
#Ecto.Changeset<action: nil, changes: %{}, errors: [], data: #A<>, valid?: true>
iex(2)> Ecto.Changeset.fetch_field!(changeset, :a) 
# 5
iex(3)> Ecto.Changeset.cast(%A{a: 1, b: 1},  %{"a" => "", "b" => ""}, [:a, :b])
#Ecto.Changeset<
  action: nil,
  changes: %{a: 5, b: nil},
  errors: [],
  data: #A<>,
  valid?: true
>
iex(4)> Ecto.Changeset.cast(%A{a: 1, b: 1},  %{"a" => nil, "b" => nil}, [:a, :b])
#Ecto.Changeset<
  action: nil,
  changes: %{a: nil, b: nil},
  errors: [],
  data: #A<>,
  valid?: true
>

I guess I found this surprising so wanted to ask why it’s the case or if it is documented anywhere?

Marked As Solved

hauleth

hauleth

Yes, this is documented in Ecto.Changeset.cast/3 in the option :empty_values. You can force the same behaviour by using

changeset = Ecto.Changeset.cast(%A{}, %{"a" => "", "b" => ""}, [:a, :b], empty_values: [])

:default just treats the values literally.

Where Next?

Popular in Questions Top

minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
Tee
can someone please explain to me how Enum.reduce works with maps
New
pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
lessless
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
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
vac
Hi, I'm quite new in Elixir and I'm trying to format a string to a PEM format. I have the certificate value like MIIDBTCCAe2...... and ...
New
shahryarjb
Hello, I have map which I want to convert it to string like this: the map: %{last_name: "tavakkoli", name: "shahryar"} the string I ne...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers' Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
idi527
I’ve been re-reading swift book again and noticed that multiline strings there don’t have a trailing line break, unlike in elixir iex(2)...
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
sergio
In Ruby, I can go: User.find_by(email: "foobar@email.com").update(email: "hello@email.com") How can I do something similar in Elixir? ...
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
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
sergio
I couldn’t find any guides that worked well with Phoenix 1.6.0 and esbuild. I hope this helps people test the waters and eases you into t...
New
chrismccord
This release brings a number of exciting features, including integration with the new Phoenix LiveDashboard and Phoenix LiveView. There h...
New
chensan
I have a User schema with a :from_id field set to type :string: defmodule TweetBot.Repo.Migrations.CreateUsers do use Ecto.Migration ...
New
msaraiva
Surface is an experimental library built on top of Phoenix LiveView and its new LiveComponent API that aims to provide a more declarative...
564 42633 214
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
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