:在rails中选择find_in_batches

时间:2010-09-08 01:29:26

标签: 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

2 个答案:

答案 0 :(得分:26)

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

在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

如果您在控制台中尝试此操作,它会像这样生成SQL ...

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

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

答案 1 :(得分:-21)

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

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

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