FasterCSVを使用してmysqlからcsvファイルに一部のデータをエクスポートします。私は、出力されたCSVの列が、クエリのselect文と同じ順序であるのが好きです。
例:
rows = Data.find(
:all,
:select=>"name, age, height, weight"
)
headers = rows[0].attributes.keys
FasterCSV.generate do |csv|
csv << headers
rows.each do |r|
csv << r.attributes.values
end
end
CSV出力:
height,weight,name,age
74,212,bob,23
70,201,fred,24
.
.
.
私はCSV列を私と同じ順番にしたいselectステートメント。明らかに、属性メソッドは動作しません。私のcsvファイルの列がselect文と同じ順序になるようにするための最良の方法についてのアイデアはありますか?多くのデータとパフォーマンスが問題になります。 select文は静的ではありません。私はrows.eachループ内の列名をループすることができることを認識しますが、それはちょっと汚いようです。
回答:
回答№1は1使用 コンマ 宝石:
class Data < ActiveRecord:Base
comma do
name
age
height
weight
end
comma :height_weight do
name
age
height_in_feet
weight
end
end
これで、次のようにCSVを生成できます。
Data.all(:select => "name, age, height, weight").to_comma
Data.all(:select => "name, age, height_in_feet, weight").to_comma(:height_weight)
編集:
ActiveRecord finderは結果セット内の計算カラムをサポートしていません。
data = Data.first(:select => "name, age, height/12 as height_in_feet, weight")
data.height_in_feet # throws error
あなたは使うことができます select_extra_columns 計算された列を含める場合はgemを使用します。
回答№2の場合は0
これを試して:
def export_to_csv (rows, col_names)
col_names = col_names.split(",") if col_names.is_a?(String)
FasterCSV.generate do |csv|
# header row
csv << col_names
# data rows
rows.each do |row|
csv << col_names.collect{|name| row.send(name)}
end
end
end
cols = "name, age, height, weight"
rows = Data.find(:all, :select=> cols)
csv = export_to_csv(rows, cols)