我可以使用Rails find_each方法,如:
User.find_each(:batch_size => 10000) do |user|
------
end
使用find_each方法有没有办法获取数组的索引?喜欢:
User.find_each(:batch_size => 10000).with_index do |user, index|
------
end
答案 0 :(得分:57)
作为此问题的更新。有效记录 4.1.4 已添加find_each.with_index
对User.find_each(:batch_size => 1000).with_index do |user, index|
user.call_method(index)
end
的支持。
{{1}}
答案 1 :(得分:15)
从method definition可以看出,这是不可能的。
def find_each(options = {})
find_in_batches(options) do |records|
records.each { |record| yield record }
end
end
为了完成您想要做的事情,您需要创建自己的方法修改版本
class User
def find_each(options = {})
find_in_batches(options) do |records|
records.each_with_index { |record| yield record, index }
end
end
end
User.find_each(:batch_size => 10000) do |user, index|
------
end
或使用实例变量。
index = 0
User.find_each(:batch_size => 10000) do |user|
# ...
index += 1
end
没有其他默认解决方案,如方法实现所示。
答案 2 :(得分:10)
您的问题已在Rails主分支中实现。要实现这一点,它需要使用Rails边缘,因为尚未将其合并到任何版本中。请参阅此合并拉取请求:https://github.com/rails/rails/pull/10992。
所以将它添加到你的Gemfile:
gem 'rails', github: 'rails/rails'
这将允许您运行您描述的代码:
User.find_each(batch_size: 10000).with_index do |user, index|
puts "UserID: #{user.id.to_s} has index ##{index.to_s}"
end
当然,在边缘版本上运行是有风险的,所以不要在生产中这样做。但是看一下pull请求,看看添加少量代码才能使其工作。你可以修补它,直到它被合并到Rails版本中。
答案 3 :(得分:0)
只需使用本地变量:
index = 0
User.find_each(:batch_size => 10000) do |user|
------
index += 1
end
答案 4 :(得分:-5)
您可以获取所有用户并通过块发送它们以及相应的索引,如下所示。
User.all.each_with_index do |user, index|
puts "email is " + "#{user.email}" + " and user index is " + "#{index}"
end