Вы можете сделать это в одной строке
songs = [
{'title' => 'Title 1', 'artist' => 'Artist 1', 'album' => 'Album 1'},
{'title' => 'Title 2', 'artist' => 'Artist 2', 'album' => 'Album 2'},
{'title' => 'Title 3', 'artist' => 'Artist 1', 'album' => 'Album 1'},
{'title' => 'Title 4', 'artist' => 'Artist 1', 'album' => 'Album 1'},
{'title' => 'Title 5', 'artist' => 'Artist 3', 'album' => 'Album 1'}
]
songs.group_by{|h| h[:album]}.inject({}){|h,(album,s)| h[album] = {:title => album, :songs => s }; h }
#=> {"Album 1"=>{:songs=>[{:artist=>"Artist 1", :album=>"Album 1", :title=>"Title 1"}, {:artist=>"Artist 1", :album=>"Album 1", :title=>"Title 3"}, {:artist=>"Artist 2", :album=>"Album 1", :title=>"Title 4"}, {:artist=>"Artist 3", :album=>"Album 1", :title=>"Title 5"}], :title=>"Album 1"}, "Album 2"=>{:songs=>[{:artist=>"Artist 2", :album=>"Album 2", :title=>"Title 2"}], :title=>"Album 2"}}
Только я не понимаю, почему вы используете название альбома дважды: в качестве ключа хеша и в качестве параметра заголовка?Вы должны использовать только один раз, я думаю:)