Ruby迭代所有模型对象,操纵每个对象并添加到CSV

时间:2015-12-10 14:53:05

标签: ruby csv enumeration

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

我有一个get方法,它执行对象迭代并返回一个数组:

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

我可以在get中调用generate并迭代所有结果数组,但这会导致性能下降。我如何在generateget一次使用数组?

我相信普查员可以在这方面提供帮助,但我不知道从哪里开始。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您可以使用chicago

Enumerator

然后,在您的CSV生成方法中,您可以使用def get Enumerator.new do |yielder| Client.find_each do |client| yielder.yield [client.id, client.name] end end end 并使用client_enumerator = get进行迭代,以便一次获得一个数组。