db/model | string/no enum | integer/array enum | integer/hash enum | string/hash enum | pg enum/hash enum |
---|---|---|---|---|---|
migration(pg) | add_column(:scraper_requests, :initiation_context, :string) |
add_column(:scraper_requests, :initiation_context, :integer) |
add_column(:scraper_requests, :initiation_context, :integer) |
add_column(:scraper_requests, :initiation_context, :string, default: 'regular') |
execute("CREATE TYPE initiation_contexts AS ENUM ('regular', 'onboarding');") add_column(:scraper_requests, :initiation_context, :initiation_contexts) |
model | validates(:initiation_context, inclusion: { in: %w[onboarding] } |
enum initiation_context: [:regular, :onboarding] |
enum initiation_context: { regular: 0, onboarding: 1 } |
enum initiation_context: { regular: 'regular', onboarding: 'onboarding' } |
enum initiation_context: { regular: 'regular', onboarding: 'onboarding' } |
changes | easy | hard (order dependency) | easy | easy | hard (requires db migration, value updates complicated) |
readability | good | bad (integer values in the db) | bad (integer values in the db) | good | good |
helper methods | no | yes | yes | yes | yes |
validation (inclusion) | no (explicitly added) | yes | yes | yes | yes |
db constraint (data integrity assured) | no | no | no | no | yes |
comments | best query performance and minimal size when using integer | best query performance and minimal size when using integer | not documented well (see rails/rails#43529) |
- rails 6 docs:
- latest docs:
- other