修复导轨坏练习使得更漂亮

时间:2018-05-23 21:27:08

标签: ruby-on-rails ruby

我正在尝试从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

如果您注意到我实际上使用相同的键来解决问题并进行转换。我如何压缩这两者并使它们更可重复使用?

1 个答案:

答案 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