:在rails中选择find_in_batches

bad*_*aam 7 ruby-on-rails

如何在find_in_batches中包含:select子句.以下命令在'字段列表'中抛出错误"Mysql :: Error:Unknown column'users.id':.

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
Run Code Online (Sandbox Code Playgroud)

小智 32

因此,如果您正在考虑使用find_in_batches,则可能意味着您需要完成大量记录,而您很可能只希望从DB返回选择字段.

在Rails 3/4中,您可以使用任何其他类型的ActiveRecord :: Relation方法链接find_in_batches(或者至少,大多数......我还没有亲自测试过所有这些).

这可能就是你要找的东西

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
Run Code Online (Sandbox Code Playgroud)

如果你在控制台中尝试这个,它就像这样生成SQL ...

 SELECT id FROM `users` WHERE (`users`.`id` > 895846) ORDER BY `users`.`id` ASC LIMIT 100
Run Code Online (Sandbox Code Playgroud)

在此处查看更多信息:http://api.rubyonrails.org/classes/ActiveRecord/Batches.html


mar*_*lly -31

如果您只检索每个查询模型的所有字段,那么您使用 Rails 的生活将会更加轻松,如下所示:

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

正如您的问题所示,修剪后的选择列表提供了有限的数据库性能改进,但在大多数情况下不足以值得使用更笨重的代码。

  • 天哪..不要听这个..“如果你只是检索所有字段”。我们(我们的处理器)为流量付费......一个包含 20 个字段乘以 170,000 条记录的表,其中一些字段是 varchar(max) 并且您只需要 ids。是的,好主意,通过数据库网络拉出一个又一个的megs,并用我们不关心的东西填充我们的内存。除非您有丝毫关心性能和稳定性,否则这会更容易。 (14认同)