Skip to content

Fix Rails 8.1 compatibility for Column#initialize signature#4

Open
pfeffer wants to merge 1 commit intojanuszm:mainfrom
pfeffer:fix-rails-81-column-signature
Open

Fix Rails 8.1 compatibility for Column#initialize signature#4
pfeffer wants to merge 1 commit intojanuszm:mainfrom
pfeffer:fix-rails-81-column-signature

Conversation

@pfeffer
Copy link

@pfeffer pfeffer commented Feb 3, 2026

Hi @januszm! I ran into this issue when upgrading to Rails 8.1.2 - could you please take a look?

Summary

Rails 8.1 changed Column#initialize to require cast_type as the second argument, breaking schema
loading.

Error:

  NoMethodError: undefined method 'mutable?' for nil (NoMethodError)
      @default = default.nil? || cast_type.mutable? ? default : cast_type.deserialize(default)

Stack trace:

  active_record/connection_adapters/column.rb:25:in initialize
  active_record/connection_adapters/redshift_8_0/column.rb:13:in initialize
  active_record/connection_adapters/redshift_8_0/schema_statements.rb:160:in new_column
  active_record/connection_adapters/redshift_8_0/schema_statements.rb:155:in block in columns
  active_record/model_schema.rb:609:in load_schema!
  active_record/core.rb:319:in block in find_by

Root cause

# Rails 8.0
def initialize(name, default, sql_type_metadata, null, ...)

# Rails 8.1
def initialize(name, cast_type, default, sql_type_metadata, null, ...)

The adapter passes default where Rails 8.1 expects cast_type, so cast_type.mutable? is called on nil.

Fix

  • Conditionally define RedshiftColumn#initialize based on Rails version
  • Pass cast_type through columns() → new_column() → RedshiftColumn.new()
  • Maintains backwards compatibility with Rails 8.0

Tested

  • Rails 8.1.2 - schema loading works
  • Rails 8.0 - backwards compatible

Rails 8.1 changed the Column#initialize signature to require cast_type
as the second argument:

  Old (8.0): initialize(name, default, sql_type_metadata, null, ...)
  New (8.1): initialize(name, cast_type, default, sql_type_metadata, null, ...)

This caused a NoMethodError when loading schemas:
  undefined method 'mutable?' for nil (NoMethodError)

The fix:
- Conditionally define RedshiftColumn#initialize based on Rails version
- Pass cast_type through from columns() -> new_column() -> RedshiftColumn.new()
- Maintains backwards compatibility with Rails 8.0

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants