Let's say I have a MagicLinks
model backed by magic_links
Postgres table.
Both the id
and token
columns are of type UUID
and have default values of
gen_random_uuid()
. That means from the Rails-side when I go to create a
MagicLink
record, I don't have to think about specifying values for id
or
token
-- the DB will take care of that.
> magic_link = MagicLink.create(expires_at: Time.zone.now, user: User.last)
User Load (5.9ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT $1 [["LIMIT", 1]]
TRANSACTION (0.1ms) BEGIN
MagicLink Create (3.1ms) INSERT INTO "magic_links" ("user_id", "expires_at", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"
...
> magic_link.id
=> "6c6dddbf-4427-407d-8dc8-eef8cb65d491"
> magic_link.token
=> nil
This create
call is translated into an insert
SQL statement that includes a
returning
clause. For create
it is always returning "id"
. This means that
the UUID
value generated in Postgres-land for id
gets passed back into the
ActiveRecord instance. The UUID
value generated for token
, however, is not
because token
isn't specified in the returning
clause.