UUIDs as defaults for Ecto in Phoenix
Phoenix uses Postgres’ sequential auto-incrementing id
s out of the box when creating database records. This is convenient, but auto-incrementing id
s can be a dead giveaway to some business data you may not want to air so openly. Since by default the count is incremented by 1 for each new record in the database, it’s easy for users (or competition) to figure out how many User
s, Post
s, or Comment
s you have in your system when forming urls since they’ll end up like /user/37/comment
(replace 37
with how many User
s you have in your system, for example).
Fourk’s article on using UUIDs (universally unique identifier) is a good read - I won’t reiterate what they covered. You should read it. To make one thing clear is if you’ve already started your Phoenix app & want to make UUIDs the default for your models. To do so, navigate to <your_project>/web/web.ex
and place the code below in the quote do
block of the model
function block.
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
Your model
function block should look like below (including function definition):
def model do
quote do
use Ecto.Schema
import Ecto
import Ecto.Changeset
import Ecto.Query
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
end
end