2016-02-29 41 views
0

目前,我正在使用Rails并能够导出,但数据库中有数值格式的值,我需要将它们转换为字母数字格式。我有翻译,但我不知道该怎么做,而导出为CSV在Rails中,如何在转换特定列的值时导出为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 

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

+0

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

回答

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) } 
相关问题