loading...

Using custom IDs in Lucky

jwoertink profile image Jeremy Woertink ・1 min read

If you're using Lucky, and you have a schema that's not default, you may need to create a custom primary key.

I had to do this for an app where my primary keys were defined in postgres like character varying(18). Just doing String wasn't going to be good enough since Avram defines those as just text. Here's how I did it.

# src/models/concerns/custom_id.cr
alias CustomID = String

module Avram::Migrator::Columns::PrimaryKeys
  class CustomIDPrimaryKey < Avram::Migrator::Columns::PrimaryKeys::Base
    def initialize(@name)
    end

    def column_type : String
      "character varying(18)"
    end
  end
end

module Avram::Migrator::Columns
  class CustomIDColumn < Avram::Migrator::Columns::Base
    @default : String? = nil

    def initialize(@name, @nilable, @default)
    end

    def column_type
      "character varying(18)"
    end
  end
end

Then in my model, I can now do this:

# src/models/user.cr
class User < BaseModel
  skip_default_columns
  table do
    primary_key id : CustomID
    column created_on : Time
    column updated_on : Time
  end
end

Discussion

pic
Editor guide