ja hallo erstmal,..

ich habe gerade ein blaues Wunder mit Rails 1.2.6 erlebt:
Eine edit-View für Model zieht irgendwas zwischen 30 und 100 Referenzierte 
Objekte, für die alle ACLs überprüft werden.
D.h. für jedes dieser Objekte werden
- Eine Hand voll group_ids aus der ACL-Definition aufgelöst
- Vom aktuellen User die group_ids gelesen und überprüft, wie die group_ids 
von den ACLs abgedeckt werden.

Im Grunde genommen zog dieser Code ca. 3 mal pro referenziertem Objekt:

group_id = (Group.find_by_name("#{groupname}") || Group.new).id
allowed = User.find(CURRENT_USER_DATA[:id]).group_ids.include?(group_id)

Das Laden der Seite brauchte ca. 20 Sekunden (kleinerer root-Server) im 
production-Mode.
Nachdem ich das ganze in den development-Mode gesetzt habe, habe ich mal 
quick-and dirty die Ergebnisse dieser Calls gecached:

 unless CURRENT_USER_DATA[groupname]
      group_id = (Group.find_by_name("#{groupname}") || Group.new).id
      CURRENT_USER_DATA[groupname] = group_id
  else
      group_id = CURRENT_USER_DATA[groupname]
  end
    CURRENT_USER_DATA[:group_ids].include?(group_id)

Ergebnis: Das rendern braucht im development-Mode 1.9sec und im 
Production-Mode 1.7sec.

Was mich dabei nur irgendwo umgehauen hat ist:
Warum schafft es ActiveRecord nicht das Abfragen der group_ids und das 
Auflösen der symbolischen Group-Namen zu cachen?
Wie kann ich erreichen, dass ActiveRecord (wie z.B. Toplink das kann) die 
Datenbank nicht mehrere hundert Male damit quält, die gleichen Namen 
aufzulösen und die gleichen ids herauszusuchen?

Danke,
Keep smiling
yanosz

_______________________________________________
rubyonrails-ug mailing list
[email protected]
http://mailman.headflash.com/mailman/listinfo/rubyonrails-ug

Antwort per Email an