krut

krut

I am writing an API integration that uses embedded schemas to cast response data before it is used internally. The id fields in the responses are typically integers, and I would like them to convert them to strings.

I could transform these values manually, but there are a number of different responses and schemas, all with the same id format, so I am thinking it could be nice to define a custom type that handles this conversion “behind the scenes”.

I have defined my type as:

defmodule Types.ResponseID do
  @behaviour Ecto.Type
 
  def type, do: :string

  def cast(integer) when is_integer(integer) do
    { :ok, Integer.to_string(integer) }
  end

  def cast(string) when is_binary(string), do: { :ok, string }

  def cast(_), do: :error
end

And my schema:

defmodule Thing do
  use Ecto.Schema

  import Ecto.Changeset

  @primary_key false

  embedded_schema do
    field :id, Types.ResponseID
  end

  def from_response(data) do
    %__MODULE__{}
    |> Ecto.Changeset.cast(data, [:id])
    |> apply_changes()
  end

Which then throws these warnings:

warning: function dump/1 required by behaviour Ecto.Type is not implemented (in module ResponseID)
  lib/types/response_id.ex:1: ResponseID (module)

warning: function embed_as/1 required by behaviour Ecto.Type is not implemented (in module ResponseID)
  lib/types/response_id.ex:1: ResponseID (module)

warning: function equal?/2 required by behaviour Ecto.Type is not implemented (in module ResponseID)
  lib/types/response_id.ex:1: ResponseID (module)

warning: function load/1 required by behaviour Ecto.Type is not implemented (in module ResponseID)
  lib/types/response_id.ex:1: ResponseID (module)

My question - Do I need to add @behaviour Ecto.Type for a custom type in an embedded schema? Or is this a better way to define a custom type for this use case?

I found this comment suggesting that the additional behaviors (e.g. load/dump) are not necessary for custom types in embedded schemas, but I haven’t found any documentation showing an example of how to implement:

Thanks!

Showing Posts 1 to 3

LostKobrakai

LostKobrakai

The callbacks are still required for the behaviour to be correctly implemented, otherwise you’ll get the warnings you see. They’re just not used for fields in embedded schemas.

Given you also have warnings about :embed_as and :equal? you’ll want to implement those as well or use use Ecto.Type instead of @behaviour Ecto.Type to have defaults generated.

krut

krut OP

Thanks! I think use Ecto.Type is what I was looking for here, since I really only need to cast. Warnings are gone and it’s working great :slight_smile:

Aetherus

Aetherus

In Ecto 3.x, you can implement embed_as/1 and return :dump. If you do so, Ecto will call YourCustomType.dump/1 before JSON serialization when saving embedded schema into DB. On the other hand, if embed_as/1 returns :self, then Ecto won’t call dump before JSON serializing an embed.

— All posts loaded —

Where Next? Top

Trending in Questions Top

stjefim
Hello! Suppose you are building workflow (order / task / payment) processing system with the following requirements: Each workflow con...
New
water
I’m aware of 2 such projects, are there others? git: GitHub - team-alembic/realworld: A fullstack Phoenix LiveView application with back...
New
peck
Hi everyone. My team and I have been working on a fairly modest app based around video streaming and chat, but we’ve landed a customer t...
New
bradley
I really like the adapter patterns that ecto, nebulex, waffle, etc. use and would love find something similar for a key management servic...
New
unaware8150
Hello folks! So at work, we are seeing some situations where we have to define some “fixed” strings that are used across the codebase in...
New
Alvinkariuki
How Can I Optimise Compile Time Dependencies I have been building an elixir application for about 2 years now. Many modules and files ha...
New
leoschweizer
Hi, we run different LLM models across a cluster, with each node loading a configurable subset. Model-specific queues let nodes consume ...
New

Other Trending Topics Top

mudasobwa
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
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
juhalehtonen
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New
webofbits
With AI doing more of the implementation work, I’ve been wondering how much coding I should deliberately keep doing myself. My main conc...
#ai
New
budgie
I love Elixir. It’s one of 2 programming languages I’ve ever fallen in love with. But I don’t use it anymore. Serverless was the promis...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews