Onze dagmethode #17: Enumerable#make_index
Geplaatst door Michiel de Mare wo, 27 feb 2008 08:00:00 GMT
Weet je wat ik zo geweldig aan databases vind? En wat ik zo mis aan object-modellen? Dat is dat databases het zo makkelijk maken om data te indexeren.
Stel je voor, je hebt een ongelooflijke bak data, ongeordend, continue veranderend, maar omdat je database een paar indexen bijhoudt kun je toch binnen milliseconden bij elk item dat je wilt.
Zou het niet leuk zijn als dat in Ruby ook kon? Het overkomt me namelijk best vaak dat ik een lijst met honderden items waarin ik wil zoeken. En er overheen itereren wordt al heel snel traag. Dus voor dat ik het weet heb ik overal losse hashes liggen die ik als index gebruik. Maar wat een verschil met een database.
Laten we vandaag een eerste stap in de goede richting zetten met de make_index
methode.
module Enumerable
def make_index(*names)
Struct.new(*names).new(*names.map{|n| group_by(&n)})
end
end
index = User.find(:all).make_index(:login, :id, :nickname)
index.login['mdemare'] => [<#User ...>]
index.nickname['Michiel'] => [<#User ...>]
Voor een andere keer: indices op meer dan één attribuut, en het indexeren van attributen met een natuurlijke ordening.