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
进行迭代以一次获取一个数组。
我需要遍历 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
进行迭代以一次获取一个数组。