2010-09-29 25 views
0

le code suivant:.Pourquoi traite-t-RubyGems FasterCSV [[1,3,5], [2,4,6]] to_csv comme "135246 n"

[1,3,5].to_csv 
    => "1,3,5\n"  # this is good 

[[1,3,5], [2,4,6]].to_csv 
    => "135,246\n"  # why doesn't it just do it for array of array? 

mais exigent plutôt:

data = [[1,3,5], [2,4,6]] 
csv_string = FasterCSV.generate do |csv| 
    data.each {|a| csv << a} 
end 
=> "1,3,5\n2,4,6\n" 

ou moins:

data = [[1,3,5], [2,4,6]] 
csv_string = FasterCSV.generate {|csv| data.each {|a| csv << a}} 
=> "1,3,5\n2,4,6\n" 

La question est, quand donné un tableau de tableau, pourquoi est-to_csv pas conçu pour gérer automatiquement, de sorte que Rails, nous pouvons faire

respond_to do |format| 
    format.csv { render :text => data.to_csv } 

Répondre

1

[[1,3,5], [2,4,6]]. Chaque {| ligne | met line.to_csv} n'est pas si mauvais. Vous pouvez toujours remplacer Array # to_csv si vous le souhaitez.

Je suppose que la décision de FasterCSV de ne pas implémenter cela était parce qu'il est difficile d'être absolument certain que c'est ce que le programmeur voudra. Que se passe-t-il si l'entrée est [[1], 2, 3, 4]? Le simple fait de regarder le premier élément du tableau externe vous ferait penser qu'il peut s'agir d'un tableau de tableaux ...

+0

comment est-ce que [[1,3,5], [2,4,6]] chaque {| line | met line.to_csv} 'travailler avec le rendu? parce que vous ne pouvez rendre qu'une seule fois, je suppose que vous devrez utiliser 's + = line.to_csv +" \ n "', ou '(@ data.map {| a | a.to_csv}). join (" \ n ")' –