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 列的顺序与我的选择语句相同。显然属性方法是行不通的。关于确保我的 csv 文件中的列与 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_columns gem。

于 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 回答