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
Top comments (0)