在Rails中如何使用带索引的find_each方法?

时间:2013-12-27 09:20:52

标签: ruby-on-rails ruby arrays ruby-on-rails-3

我可以使用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 

5 个答案:

答案 0 :(得分:57)

作为此问题的更新。有效记录 4.1.4 已添加find_each.with_indexUser.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