我需要遍历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
并迭代所有结果数组,但这会导致性能下降。我如何在generate
内get
一次使用数组?
我相信普查员可以在这方面提供帮助,但我不知道从哪里开始。
答案 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
进行迭代,以便一次获得一个数组。