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.

Kommentarfunktion ist deaktiviert