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

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)

没有其他默认解决方案,如方法实现所示.

  • 是的,我得到了..用户模型代码中的一个小修改:`def self.find_each(options = {})find_in_batches(options)do | records | records.each_with_index {|记录,索引| 产量记录,索引} end end`现在正在工作..谢谢...... (2认同)
  • 如果您正在使用rails 4,请查看Ron回答 (2认同)

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版本中.