【问题标题】:In Rails, how do I export to CSV while translating values of a specific column?在 Rails 中,如何在转换特定列的值时导出为 CSV?
【发布时间】:2016-06-12 23:56:09
【问题描述】:

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

这是我当前要导出到 CSV 的代码的 sn-p

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,但仅限于 Name 列,我只是不确定如何完成此操作。

【问题讨论】:

  • 我们需要更多信息,比如values_at(*mycolumns) 返回的值是什么?在调试时,它有助于编写一个不会命中数据库的小型测试脚本,而是使用一个复制数据库内容的小型内部数组。然后,您可以编写代码来遍历该数组并更改值并输出 CSV。然后,一旦你完成了这项工作,你就可以将该代码折叠到遍历数据库的代码中。

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


【解决方案1】:

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) }

【讨论】:

    猜你喜欢
    • 2021-03-04
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 2018-05-08
    • 2017-12-31
    相关资源
    最近更新 更多