Ryan Daigle stellt in seinem Blog ein neues ActiveRecord-Feature von Edge-Rails vor, dass noch in das 2.3 Release wandern soll:
Standardmäßig geben von ActiveRecord abgeleitete Modelle bei find() alle Ergebnisse zurück, können aber mit einer Limit-Option eingeschränkt werden. In beiden Fällen werden jedoch die Ergebnisse sofort abgerufen und im Arbeitsspeicher vorgehalten.
Das kann bei einer größeren Anzahl von Datensätzen durchaus den Speicherverbrauch signifikant erhöhen.
Üblicherweise stellen SQL-Datenbanken dafür eine Cursor-Implementierung bereit, die ein schrittweises Verarbeiten der Ergebnis-Datensätze erlaubt.
Rails’ ActiveRecord stellt ab Rails 2.3.x dafür nun zwei neue Methoden bereit:
ActiveRecord::Base.each()
Article.each { |a| ... } # => iteriert über alle Article in 1000er Blöcken (Standard) Article.each(:conditions => { :published => true }, :batch_size => 100 ) { |a| ... } # => iteriert über alle veröffentlichten Artikel in Blöcken zu hundert.
ActiveRecord::Base.find_in_batches()
Article.find_in_batches { |articles| articles.each { |a| ... } } # => articles ist hier ein Array mit bis zu 1000 Artikeln (Standard) Article.find_in_batches(batch_size => 100 ) { |articles| articles.each { |a| ... } } # => articles hat in diesem Beispiel jeweils maximal 100 Artikel
ActiveRecord nutzt hierfür aber nicht die von Datenbanken bereitgestellten Cursor-Funktionen sondern baut diese mit “limit” Anfragen nach.
Link zur Commit-Meldung auf Github
Schlagworte: ActiveRecord, cursor, db, edge, rails, rails_2_3, sql

