私は Ruby の初心者ですが、他のプログラミング言語の経験は豊富です。大量のレコード(dbまたは永続ストレージから)を反復処理する必要があります。ストレージ エンジンを使用すると、範囲ごとに部分的にレコードを取得できます。PHPでは、通常、レコードの範囲をロードしてそれらを反復し、必要に応じてレコードの次の部分をロードし、前の部分を忘れるカスタムイテレータを作成します。スクリプトのメモリ使用量とストレージへのリクエスト数の間のトレードオフ。このようなもの(ここのコメントからコピー):
class Database_Result_Iterator {
...
private $_db_resource = null;
private $_loaded = false;
private $_valid = false;
function rewind() {
if ($this->_db_resource) {
mysql_free($this->_db_resource);
$this->_db_resource = null;
}
$this->_loaded = false;
$this->_valid = false;
}
function valid() {
if ($this->_loaded) {
$this->load();
}
return $this->_valid;
}
private function load() {
$this->_db_resource = mysql_query(...);
$this->_loaded = true;
$this->next(); // Sets _valid
}
}
そのようなアプローチは、Ruby ではどのように変換されますか? つまり、現在の投票者オブジェクトに属するすべての投票を返すいくつかのクラスVoterとメソッドget_votesがあります。すべての投票を含む配列ではなく、反復可能な投票のコレクションを取得することは可能です。どのように実装すればよいですか?
アップデート
ActiveRecord と RDBMS を 1 つのストレージとして考えないでください。また、ストレージとしての Redis と LRANGE のようなコマンドはどうでしょうか? Rubyでこの種の問題を解決するための共通のコードパターンに興味があります。