Abh*_*bhi 20 ruby arrays ruby-on-rails ruby-on-rails-3
我可以使用Rails find_each方法,如:
User.find_each(:batch_size => 10000) do |user|
------
end
Run Code Online (Sandbox Code Playgroud)
使用find_each方法有没有办法获取数组的索引?喜欢 :
User.find_each(:batch_size => 10000).with_index do |user, index|
------
end
Run Code Online (Sandbox Code Playgroud)
Ron*_*Ron 61
作为这个问题的更新.Active Record 4.1.4增加find_each.with_index了对文档中指出的支持.
User.find_each(:batch_size => 1000).with_index do |user, index|
user.call_method(index)
end
Run Code Online (Sandbox Code Playgroud)
Sim*_*tti 15
从方法定义中可以看出,这是不可能的.
def find_each(options = {})
find_in_batches(options) do |records|
records.each { |record| yield record }
end
end
Run Code Online (Sandbox Code Playgroud)
为了完成您想要做的事情,您需要创建自己的方法修改版本
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
Run Code Online (Sandbox Code Playgroud)
或使用实例变量.
index = 0
User.find_each(:batch_size => 10000) do |user|
# ...
index += 1
end
Run Code Online (Sandbox Code Playgroud)
没有其他默认解决方案,如方法实现所示.
Mar*_*sen 11
您的问题已在Rails主分支中实现.要实现这一点,它需要使用Rails边缘,因为尚未将其合并到任何版本中.请参阅此合并的拉取请求:https://github.com/rails/rails/pull/10992.
所以将它添加到您的Gemfile:
gem 'rails', github: 'rails/rails'
Run Code Online (Sandbox Code Playgroud)
这将允许您运行您描述的代码:
User.find_each(batch_size: 10000).with_index do |user, index|
puts "UserID: #{user.id.to_s} has index ##{index.to_s}"
end
Run Code Online (Sandbox Code Playgroud)
当然,在边缘发布上运行是有风险的,所以不要在生产中这样做.但是看一下pull请求,看看添加少量代码才能使其工作.你可以修补它,直到它被合并到Rails版本中.