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