augnustin
Ecto embed timestamps inserted_at updated
So I have this embed structure:
defmodule MyApp.Struct do
use Ecto.Schema
import Ecto.Changeset
@primary_key false
@derive Jason.Encoder
embedded_schema do
field(:name, :string)
field(:completed_at, :utc_datetime)
timestamps()
end
end
I wanted to have inserted_at and updated_at fields set, so I added the timestamps() line.
It seems like the updated_at value works correctly, but the inserted_at keeps on being updated on each update, which is not what I want.
Here’s how I do the update, from the Holder struct:
defmodule MyApp.Holder do
schema "holder" do
embeds_one(:struct, MyApp.Struct, on_replace: :delete)
end
def save_struct(holder, struct_params) do
holder
|> change()
|> put_embed(
:struct,
MyApp.Holder.changeset(
holder.struct || %MyApp.Holder{},
struct_params
)
)
|> Repo.update()
end
end
I thought this would have to do with put_embed vs cast_embed, but with cast_embed, I need to pass all struct_params, which is not what I want.
So I went for a manual solution:
field(:inserted_at, :utc_datetime)
field(:updated_at, :utc_datetime)
def changeset(struct, params) do
struct
|> cast(params, [:name, :completed_at])
|> cast(%{inserted_at: struct.inserted_at || Timex.now(), updated_at: Timex.now()}, [:inserted_at, :updated_at])
end
But this is much less elegant.
What am I doing wrong? Or is this because of the embed thing?
Thanks
First Post!
wolfiton
Hi,
What I experienced so far inserted_at and updated_at are reserved by timestamps(). Try to use something else for those fields in the migration like last_modified last_inserted. Then you can naivedatetime for the fields directly in the database or have a look here on other options.
Last Post!
augnustin
Yes you are correct.
I did change the name of the objects to un-specify those, and I might have confused myself.
Unfortunately it seems like I can’t edit it anymore. ![]()
Popular in Questions
Other popular topics
Latest Phoenix Threads
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #hex
- #security









