Ruby on Rails导出到csv - 维护mysql select语句顺序

时间:2010-03-25 04:38:28

标签: 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循环中的列名,但它似乎有点脏。

2 个答案:

答案 0 :(得分:1)

使用Comma gem:

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。

答案 1 :(得分: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)