使用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循环中的列名,但它似乎有点脏。
答案 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)