2010-09-08 47 views
4

如何在find_in_batches中包含:select子句。在‘字段列表’未知列‘users.id’:下面拋出一個錯誤「的Mysql ::錯誤。:使用rails中的find_in_batches進行選擇

Post.find_in_batches(:batch_size => 100, :select => "users.id, users.name, categories.name, posts.id", :include => [:user, :category]) do |group| 
#stuff with group 
end 

回答

-16

您使用Rails的生活會容易得多,如果你只是檢索爲每個字段型號查詢,像這樣:

Post.find_in_batches(:batch_size => 100, :include => [:user, :category]) do |post| 
    u = post.user 
    c = post.category 
    # do stuff 
end 

一個修整選擇列表,如你的問題,提供了有限的DB的性能提升,但在大多數情況下,不足以成爲值得笨重的代碼

+9

OMG ..不要聽這個..「如果你只是檢索所有的領域」。我們(我們的處理器)支付流量......一個20字段的表格170,000條記錄,其中一些字段是varchar(max),並且只在id後面。是一個很好的主意,可以在數據庫網絡中使用megs和megs,並用我們不關心的東西來填充我們的內存。除非您對性能和穩定性絲毫不在乎,否則它會更容易。 – baash05 2013-08-13 23:06:01

+0

也許元帥可能會說的是你應該避免過早的優化。我認爲你應該始終知道你的軌道查詢最終會做什麼以及將要承擔多少負載,但是試圖以開發人員週期爲代價在每種情況下擠出最後一塊性能可能不是最佳的無論是。這絕對是一種平衡。 – eremzeit 2013-11-14 23:33:09

+0

如果你正在使用find_in_batches來優化內存,如果你不打算使用它們,增加獲取所有字段的內存是沒有意義的。 – Ron 2014-07-25 12:57:33

21

所以,如果。你正在考慮使用find_in_batches,這可能意味着你有很多記錄要去粗糙,你很可能只希望從數據庫返回給你選擇的字段。

在Rails 3/4中,您可以將find_in_batches與任何其他類型鏈接ActiveRecord :: Relation方法(或者至少,大多數...我沒有親自測試過它們)。

這可能是你在找什麼

User.select(:id).find_in_batches(:batch_size => 100) do |group| 
    # do something with group... 
    # like print all the ids 
    puts group.map(&:id) 

end 

如果試圖這樣它產生這樣的SQL控制檯...

SELECT id FROM `users` WHERE (`users`.`id` > 895846) ORDER BY `users`.`id` ASC LIMIT 100 

在這裏看到更多的信息:http://api.rubyonrails.org/classes/ActiveRecord/Batches.html