将对象导出到当前内联显示数据的csv文件

时间:2019-05-14 11:39:32

标签: ruby-on-rails ruby csv export-to-csv

我有@people变量包含的数据看起来完全像这样:

我有什么

[{"id"=>1, "name"=>"Tom", "age"=>"25"},
 {"id"=>2, "name"=>"Marry", "age"=>"27"},
 {"id"=>3, "name"=>"Jack", "age"=>"28"}] 

,并且我正在尝试将数据转换为CSV文件,看起来可能是

我打算做什么

id | name | age
 1 | Tom  | 25
 2 | Marry| 27
 3 | Jack | 28

但是我的代码生成了一个CSV文件,并以内联方式显示了所有数据。例如:

我得到的东西

{"id"=>1,"name"=>"Tom","age"=>25},{"id"=>2, "name"=>"Marry", 
"age"=>"27"},{"id"=>3, "name"=>"Jack", "age"=>"28"}

我做了什么:

to_csv操作如下:

  def to_csv
    CSV.generate(option) do |csv|
      csv << column_names
      values.each do |value|
        csv << value.attributes.values_at(*column_names)
      end
    end
  end

我将此respond_to块添加到了我的一项操作中:

respond_to do |format|
   format.html
   format.csv { 
   send_data @people.to_csv,
   filename: "export.csv",
   type: 'text/csv; charset=utf-8' 
 }

我正在从外部获取数据(例如{"id"=>1,"name"=>"Tom","age"=>25 ...),因此我将该数据推送到@people变量中以供使用。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

我认为您需要以不同的方式编写函数:

  def to_csv(people)
    CSV.generate do |csv|
      return unless people.count > 0
      csv << people[0].keys
      people.each do |person|
        csv << person.values
      end
    end
  end

我想你甚至可以做

  def to_csv(people)
    CSV.generate do |csv|
      return unless people.count > 0
      csv << people[0].keys
      csv << people.each.map{|item| item.values}
    end
  end

然后将其作为函数调用:

respond_to do |format|
   format.html
   format.csv { 
   send_data to_csv(@people),
   filename: "export.csv",
   type: 'text/csv; charset=utf-8' 
 }

答案 1 :(得分:0)

您不需要像value.attributes.values_at(*column_names)那样做,只需要做value.values就可以为您提供要以CSV格式存储的值数组。

例如

people = [{"id"=>1, "name"=>"Tom", "age"=>"25"},
         {"id"=>2, "name"=>"Marry", "age"=>"27"},
         {"id"=>3, "name"=>"Jack", "age"=>"28"}]


def to_csv
    CSV.generate(headers: true) do |csv|
      csv << column_names
      people.each do |person|
        csv << person.values
      end
    end
  end

答案 2 :(得分:0)

这是我的工作方式, 在我的控制器中,我添加了

respond_to do |format|
      format.html
      format.csv { send_data @people.to_csv }
    end

然后

def self.to_csv(options = {})
      CSV.generate(options) do |csv|
        csv << column_names
        all.each do |project|
          csv << people.attributes.values_at(*column_names)
        end
      end
    end

然后不要忘记在您的config / application.rb文件中require 'csv'

然后您可以使用<%= link_to "CSV", people_path(format: "csv") %>

之类的内容链接到csv