Skip to content

define_enum_for with attribute #1662

@brcebn

Description

@brcebn

Description

Model with dynamic enum breaks the specs when same is already taken and tried to be renamed.

Reproduction Steps

class Place < ApplicationRecord
  enum :status, %i[state1 state2]
end

module Custom
  class Place < ::Place
    attribute :user_status, :integer
    enum :user_status, %i[pending
                            validated
                            excluded], validate: { allow_nil: true }

    scope :with_custom, lambda { |user|
        joins(:something)
          .select('places.*',
                  'something.status as user_status')
      } 
  end
end 

By default user_status does not exist. It's SQL created when calling the scope with_custom(user)

To make it work on version 7.1.3.4 with the following monkey patch on dedicated class

NEW_FIELDS = %I[status].freeze

class << self
  # hash to allow spec `define_enum_for` to pass
  # source: https://apidock.com/rails/v6.1.3.1/ActiveRecord/ModelSchema/ClassMethods/load_schema%21
  def columns_hash
    super
    new_columns = lease_connection.schema_cache
                                  .columns_hash('somethings')
                                  .select { |k, _v| NEW_FIELDS.include?(k.to_sym) }
    new_columns['user_status'] = new_columns.delete('status') # rename column
    @columns_hash = @columns_hash.dup # override frozen hash
    @columns_hash.merge!(new_columns)
    @columns_hash
  end
end

but it's no longer working for Rails 7.2.2.1 and obviously not for Rails 8.0

Expected behavior

it { is_expected.to define_enum_for(:user_status).with_values(%i[pending validated excluded])}

Actual behavior

NoMethodError:
       undefined method `type' for nil
# /usr/local/bundle/gems/shoulda-matchers-6.4.0/lib/shoulda/matchers/active_record/define_enum_for_matcher.rb:533:in `column_type_matches?'
 # /usr/local/bundle/gems/shoulda-matchers-6.4.0/lib/shoulda/matchers/active_record/define_enum_for_matcher.rb:358:in `matches?'

System configuration

shoulda_matchers version: 6.4.0
rails version: 7.2-stable
ruby version: 3.3.4

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions