我正在尝试从ActiveRecord创建CSV文件。我想为CSV文件显示我自己的自定义标题,而不是属性名称。我还想重新排序列,而不是使用数据库表中的列顺序。
我不满足于如何重复以及如何复制粘贴,我想知道是否有人对更清洁的解决方案有任何建议。
模式:
create_table "myTable", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
t.text "flight_date"
t.text "orn"
t.text "flight_num"
t.datetime "created_at"
end
代码:
# field names and their values
questions = {
created_at: 'DATE SUBMITTED',
flight_date: 'FLIGHT DATE',
flight_num: 'FLIGHT NUMBER',
orn: 'ORIGIN'
}
CSV.open('/user/pepe/myfile.csv', 'wb') do |csv|
csv << questions.values
MyModel.all.select(questionsInbound.keys).each do |inbounds|
attributes = inbounds.attributes //put the custom header
transformed = {
created_at: attributes['created_at'],
flight_dt: attributes['flight_dt'],
flight_num: attributes['flight_num'],
orn: attributes['orn']
}
csv << transformed.values.compact # get values and filter out nil
end
end
如果您注意到我实际上使用相同的键来解决问题并进行转换。我如何压缩这两者并使它们更可重复使用?
答案 0 :(得分:1)
试试这个:
questions = {
created_at: 'DATE SUBMITTED',
flight_date: 'FLIGHT DATE',
flight_num: 'FLIGHT NUMBER',
orn: 'ORIGIN'
}
CSV.open('/user/pepe/myfile.csv', 'wb') do |csv|
csv << questions.values
MyModel.all.select(questionsInbound.keys).each do |inbounds|
csv << inbounds.attributes.symbolize_keys.slice(*questions.keys).values.compact
end
end