2011-04-05 64 views
1

當我做Rails中的數據迭代器?

users = User.find(:all) 
Rails中

,從我的理解,它拉在從我的數據庫的所有用戶。

如果您有成千上萬的用戶記錄,這似乎很容易讓您的服務器的內存吃掉。這是真的?如果這是真的,有沒有一種方法來遍歷表中的數據而不殺死你的服務器?

回答

5

由於導軌2.3可以使用find_each和find_in_batches:

User.find_each { |user| user.some_method } 

將裝載1000個用戶的默認。您還擁有:batch_size選項來更改默認大小。

查找批類似,但它的陣列提供給塊,而不是單個對象:

User.find_in_batches do |users| 
    users.each { |user| user.some_method } 
end 
+0

非常酷,這完全滑倒了我! – bioneuralnet 2011-04-05 19:39:48

+0

正是我所希望的。優秀。 – 2011-04-05 20:42:04

2

是的,這絕對是真實的。爲此目的可能會有一些「對象分頁」插件,但我從未考慮過它。

我知道的一件事是,像ActiveRecord這樣的ORM在默認情況下往往非常浪費。假設您只需要用戶的用戶名和用戶名,但用戶表中實際上有12列。默認情況下,ActiveRecord抓取所有12列,從而對數據庫和服務器的內存造成不必要的負擔。爲了消除在Rails 3的浪費:

users = User.select('id, username').all 

我覺得梁2看起來像

users = User.find(:all, :select => 'id, username') 

也許不正是你要找的,但是這切出我的不少瓶頸。

+0

很好知道。 +1 – 2011-04-05 20:42:49

1

事實上,你的方法可以很容易地消耗大量的服務器資源。

作爲批量查找對象的替代方法,您可以使用幫助器will_paginate