[Rails][Sorbet] Rails 7 + sorbet-rails: enum壊れます

2022年6月30日あたりの話です。

こちら に記載されている通りなのですが、sorbet-railsはRailsのenumを直接書き換える実装になっており、Rails 7に対応していないので盛大に壊れます。

自分は、元のenumを別名で再度生やしてとりあえずそれを使うことで回避するようにしました。

↓のようにオープンクラスでActiveRecord::Enumを開いて、enum実装のコピーをoriginal_enumメソッドとして用意することで暫定対応しています。

lib/ext/active_record/enum.rb

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
module ActiveRecord::Enum
  # https://github.com/chanzuckerberg/sorbet-rails/issues/479

  def original_enum(name = nil, values = nil, **options)
    if name
      unless values
        values = options
        options = {}
      end
      return _enum(name, values, **options)
    end

    definitions = options.slice!(:_prefix, :_suffix, :_scopes, :_default)
    options.transform_keys! { |key| :"#{key[1..-1]}" }

    definitions.each { |name, values| _enum(name, values, **options) }
  end
end

config/initializers/extensions.rb

1
2
# typed: strict
require 'ext/active_record/enum'

sorbet-railsとても助かっていて感謝しているのですが、enumの実装に関しては上書きする形にしないでほしかったなーというお気持ちです。

Built with Hugo
テーマ StackJimmy によって設計されています。