DEV Community

hiko1129
hiko1129

Posted on • Originally published at note.hiko1129.com on

[Rails][Sorbet] Define Rails enum using T::Enum

Translate ja to en

T::Enumからindex付きのhashに変換するやつを書いてRailsのenum設定に使っています。

sorbet-rails使っている場合には逆にenum書くと型定義できた気がする(自分の使っているバージョンだと破損しているのでよく知らず)。

class AAA < ApplicationRecord
  extend T::Sig

  class A < T::Enum # 共通メソッドとしてto_symやto_hashはconcernsなりにあるとよいかと
    extend T::Sig

    enums do
      Hoge = new('hoge')
      Fuga = new('fuga')
      Piyo = new('piyo')
    end

    sig { returns(Symbol) }
    def to_sym
      serialize.to_sym
    end

    class << self
      extend T::Sig

      sig { returns(T::Hash[Symbol, Integer]) }
      def to_hash
        values.each.with_index.each_with_object({}) do |(item, idx), result|
          result[item.to_sym] = idx
        end
      end
    end
  end

  # AAA::A.to_hash => {:hoge=>0, :fuga=>1, :piyo=>2}
  enum a: A.to_hash

  sig { returns(A) }
  def deserialize_a
    A.deserialize(a)
  end
end
Enter fullscreen mode Exit fullscreen mode

Top comments (0)