Columns With Default Values Are Nil On Create

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.

source

Last updated

Was this helpful?