Ни одно из этих решений не рассматривает константу с несколькими родительскими модулями. Например:
A::B::C
Начиная с Rails 3.2.x вы можете просто:
"A::B::C".deconstantize #=> "A::B"
Начиная с Rails 3.1.x вы можете:
constant_name = "A::B::C"
constant_name.gsub( "::#{constant_name.demodulize}", '' )
Это потому, что #demodulize является противоположностью #deconstantize:
"A::B::C".demodulize #=> "C"
Если вам действительно нужно сделать это вручную, попробуйте следующее:
constant_name = "A::B::C"
constant_name.split( '::' )[0,constant_name.split( '::' ).length-1]