Ruby 遍历所有模型对象,操作每个对象并添加到 CSV

Ruby iterate over all model objects, manipulate each and add to CSV

我需要遍历 Client 模型的所有对象,进行一些操作以获得数组,然后将该数组附加到 CSV 文件。

我有一个执行对象迭代的 get 方法和 returns 一个数组:

def get
  Client.find_each do |client|
    [client.id, client.name] # How do I return one array at a time?
  end
end

那我就有了实际的CSV生成方法:

def generate
  CSV.open('file', 'w') do |csv|
    csv << # How do I get one array at a time from the above get?
  end
end

我可以在 generate 中调用 get 并遍历所有结果数组,但这会降低性能。如何在 generate 中一次使用一个数组,由 get?

返回

我相信普查员可以提供帮助,但我不确定从哪里开始。

Ruby 块来救援:

def get
  raise 'Block required' unless block_given?
  Client.find_each do |client|
    yield [client.id, client.name] # this will be yielded on each iteration
  end
end

def generate
  CSV.open('file', 'w') do |csv|
    get do |id, name|
      csv << [id, name] # this will be called on each `find_each` from above
    end
  end
end

您可以使用 Enumerator:

def get
  Enumerator.new do |yielder|
    Client.find_each do |client|
      yielder.yield [client.id, client.name]
    end
  end
end

然后在您的 CSV 生成方法中,您可以使用 client_enumerator = get 并使用 client_enumerator.next 进行迭代以一次获取一个数组。