0

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 ループ内で列名をループできることはわかっていますが、ちょっと汚いようです。

4

2 に答える 2

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ファインダーは、結果セットの計算列をサポートしていません。

data = Data.first(:select => 'name, age, height/12 as height_in_feet, weight')
data.height_in_feet # throws error

計算列を含める場合は、select_extra_columnsgemを使用できます。

于 2010-03-25T06:05:09.670 に答える
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)
于 2010-03-25T18:01:14.613 に答える