/ / Ruby on Railsをcsvにエクスポートする - mysql select文の順序を維持する - mysql、ruby-on-rails、csv、fastercsv

Ruby on Railsをcsvにエクスポート - mysql select文の順序を維持する - mysql、ruby-on-rails、csv、fastercsv

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)