Techioz Blog

Rubyでオブジェクトを別のクラスに変換する方法はありますか

概要

モデルがあるとしましょう

User < ActiveRecord::Base
end

そして彼のSTIの兄弟

MasqueradeUser < User
end 

masquerade_user =  MasqueradeUser.find 123
masquerade_user.class
# => MasqueradeUser

ばかげているように聞こえますが、このオブジェクトを親クラス User に変換して戻すことは可能です。

masquerade_user.some_magic.class   # => User

mode_name、is_a?(User) などのメソッドをオーバーライドして、MasqueradeUser が User のような値を返すようにできることはわかっています。

MasqueradeUser < User
  def model_name
    'User'
  end
end 

オブジェクトを親クラスのインスタンスに完全にダウングレードする方法があるかどうか疑問に思っていました

解決策

ActiveRecord の become 関数を使用できます - ここを参照してください。