パパエンジニアのアウトプット帳

30歳に突入した1児のパパエンジニアのブログ

RailsでenumerizeのカラムをSTIとして使う

これのenumerize版。

qiita.com

既存のモデルを分けたかったので、参考にさせてもらった。
すでにenumerizeの利用しているカラムをSTIのカラムにしたかったので、inheritance_columnでのSTIのデフォルトカラム(type)を変更もした。

class Payment < ActiveRecord::Base
  extend Enumerize

  self.inheritance_column = "pay_type"
  
  enumerize :pay_type, in: { credit_card: 0, bank_transfer: 10, paypal: 20 }, scope: true, predicates: true

  class << self
    def find_sti_class(type)
      type_name = pay_type.find_value(type).camelize
      "Payment::#{type_name.to_s.camelize}".constantize
    end

    def sti_name
      pay_type.find_value(name.demodulize.underscore).value
    end
  end
end

sti_nameメソッドの定義もなんでいるのかと思ったのですが、Payment::CreditCard.newとした時にinheritance_columnで定義したカラムに期待する値がちゃんと入るようにしないとなのでちゃんと定義しましょう。 (ここで使われるので)