【发布时间】:2013-05-11 12:26:16
【问题描述】:
我是 Ruby 的新手,但我在其他编程语言方面有很多经验。我需要迭代大量记录(来自数据库或任何持久存储)。存储引擎允许我按范围检索部分记录。在 PHP 中,我通常编写自定义迭代器来加载记录范围,并在需要时加载记录的下一部分并忘记前一部分。脚本内存使用和存储请求计数之间的一些权衡。像这样的东西(复制自 cmets here):
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 中是如何转变的? IE。我有一些类 Voter 和方法 get_votes 返回所有 votes 属于当前选民对象。可以检索的不是包含所有选票的数组,而是可以迭代的选票集合。我应该如何实现它?
更新
请不要将 ActiveRecord 和 RDBMS 视为仅一种可能的存储方式。 Redis 作为存储和 LRANGE 之类的命令又如何呢?我对在 Ruby 中解决此类问题的通用代码模式很感兴趣。
【问题讨论】:
-
您可以在此处查看有关活动记录的文档:guides.rubyonrails.org/active_record_querying.html .. 关键字:例如限制和偏移量..
-
那么 Redis 作为存储呢?我对在 Ruby 中解决此类问题的通用代码模式感兴趣。
-
如果你使用redis,我会推荐使用redis gem..github.com/redis/redis-rb
-
据我所知,gem 只实现了标准的 Redis 协议。但我正在寻找封装迭代逻辑的集合实现。基本上,无论什么样的存储引擎都会在这样的集合背后。
-
如何部分检索记录?它们被完全检索或根本不检索。也许您的意思是要“检索部分记录”?
标签: ruby-on-rails ruby collections iterator persistent-storage