- Notifications
You must be signed in to change notification settings - Fork 662
Description
I have two models, both with a state
field, both with a default value. annotate_models
correctly reflected the default for both, until I ran a migration with change_column :table, :col, :type, default: 'new-default'
. Now, the changed default is documented as default(NULL), not null
(which doesn't even make sense) and I can't get it to show the correct default anymore, even after tearing down DB and re-running all migrations.
This is a pretty brand new app, undeployed, not even any controllers yet... I have no theory for how/why this is happening.
Migration:
class ChangeIdentityStateDefault < ActiveRecord::Migration[7.0] def up change_column :identities, :state, :text, default: 'submitted' Identity.where(state: 'pending_review').update_all(state: 'submitted') end def down change_column :identities, :state, :text, default: 'pending_review' Identity.where(state: 'submitted').update_all(state: 'pending_review') end end
psql
of both tables:
beekeeper=# \d identities Table "public.identities" Column | Type | Collation | Nullable | Default --------------+------+-----------+----------+------------------- id | uuid | | not null | gen_random_uuid() callback_url | text | | not null | state | text | | not null | 'submitted'::text Indexes: "identities_pkey" PRIMARY KEY, btree (id) Referenced by: TABLE "identifications" CONSTRAINT "fk_rails_403e5f005a" FOREIGN KEY (identity_id) REFERENCES identities(id) beekeeper=# \d identifications Table "public.identifications" Column | Type | Collation | Nullable | Default ------------------+-----------------------------+-----------+----------+------------------- id | uuid | | not null | gen_random_uuid() identity_id | uuid | | not null | state | text | | not null | 'submitted'::text checks | jsonb | | | claimed_age | text | | not null | submitter_notes | text | | | submitted_at | timestamp without time zone | | | created_at | timestamp(6) with time zone | | not null | updated_at | timestamp(6) with time zone | | not null | expires_at | timestamp(6) with time zone | | | rejection_reason | text | | | Indexes: "identifications_pkey" PRIMARY KEY, btree (id) "index_identifications_on_identity_id" btree (identity_id) Foreign-key constraints: "fk_rails_403e5f005a" FOREIGN KEY (identity_id) REFERENCES identities(id) Referenced by: TABLE "identification_state_transitions" CONSTRAINT "fk_rails_7c40242644" FOREIGN KEY (identification_id) REFERENCES identifications(id)
The comments generated since running the migration:
# == Schema Information # # Table name: identities # # id :uuid not null, primary key # callback_url :text not null # state :text default(NULL), not null # class Identity < ApplicationRecord
# == Schema Information # # Table name: identifications # # id :uuid not null, primary key # checks :jsonb # claimed_age :text not null # expires_at :datetime # rejection_reason :text # state :text default("submitted"), not null # submitted_at :timestamp # submitter_notes :text # created_at :datetime not null # updated_at :datetime not null # identity_id :uuid not null, indexed # # Indexes # # index_identifications_on_identity_id (identity_id) # # Foreign Keys # # fk_rails_... (identity_id => identities.id) # class Identification < ApplicationRecord
Commands
The default is incorrect (and overwrites manual corrections) both when running a post-migration rake hook and when running bundle exec annotate
directly.
Version
ruby 3.0.3p157 (2021-11-24 revision 3fb7d2cadc) [aarch64-linux-musl]
- Rails 7.0.0
annotate
3.2.0