在Rails中,如何在翻译特定列的值时导出到CSV?

时间:2016-02-29 19:37:45

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

目前,我使用Rails并且能够导出,但是DB中的值有数字格式,我需要将它们翻译成字母数字格式。我有翻译,但我不知道如何在导出到CSV时这样做

这是我目前要导出为CSV的代码片段

def self.to_csv(mycolumns)
  CSV.generate() do |csv|
    csv << mycolumns
    all.each do |ccts|
      csv << ccts.attributes.values_at(*mycolumns)
    end
  end
end

所以我最初的想法是我可以进入每个ccts并编辑它们,但我不知道如何访问哈希中的值并改变它。它仅适用于特定列。例如,如果此表用于水果,其中一个列名称为Name。如果我想将0041的值更改为Apple,但仅在“名称”列中,我只是不确定如何完成此操作。

1 个答案:

答案 0 :(得分:0)

csv导出代码非常紧凑,尤其是这一行:

csv << ccts.attributes.values_at(*mycolumns)

这使人们很难想到如何改变它。

首先想一想如果它是一个列,你将如何导出你的值。它可能看起来像:

if column_name == :name
  lookup_fruit_name(ccts.name)
else
  ccts[column_name]
end

现在您需要数组中ccts的所有值,因此可以将其发送到csv:

values = mycolums.map do |column_name|
  if column_name == :name
    lookup_fruit_name(ccts.name)
  else
    ccts[column_name]
  end
end
csv << values

然后将其放在原始导出方法的内部循环中。

如果您认为功能更强大,那么您只需编写一个实例方法来获取您的值并根据列进行转换:

def csv_value_for(column_name)
  if column_name == :name
    lookup_fruit_name( self.name )
  else
    self[column_name]
  end
end

然后你可以像这样使用它:

csv << mycolumns.map{|col| ccts.csv_value_for(col) }