Ruby on Rails 2.3 Features – ActiveRecord scoped_by
Ein interessantes neues Feature in Rails 2.3 ist die scoped_by Methode von ActiveRecord-Objekten.
Stellen wir uns ein einfaches ActiveRecord-Model Page mit den Attributen title und content vor und betrachten folgende Anweisung:
Page.scoped_by_title("a").count
=> 3
Das resultierende SQL zeigt, dass ein COUNT Statement verwendet wurde, d.h. die Generierung des SQLs erfolgt nicht nach dem Aufruf von scoped_by, sondern nach dem Count.
SELECT count(*) AS count_all FROM `pages` WHERE (`pages`.`title` = 'a')
Ein ähnliches Ergebnis hätte etwa folgende Anweisung geliefert:
Page.count(:conditions => "title = 'a'")
Auf keinen Fall aber sollte man so etwas tun:
Page.find(:all, :conditions => "title = 'a'").size
Es wird zwar ebenso 3 zurückgeliefert, jedoch ist das SQL-Statement ein völlig anderes:
SELECT * FROM `pages` WHERE (title = 'a')
Hier werden also sämtliche Datensätze der Tabelle abgefragt und weiterverarbeitet. Bei sehr großen Datenmengen hat man sich so einen 1A Speicherfresser erstellt.
Ein kurzer Tipp an Rails-Einsteiger:
Es ist für die Erstellung einer Anwendung unerläßlich den resultierenden SQL-Code anzusehen. Nur so kann evtl. Schwachstellen der Anwendung bereits frühzeitig erkennen und vermeiden. ActiveRecord hilft zwar an vielen Stellen, es ist jedoch sicherlich kein Ersatz für fundierte SQL Kenntnisse.