2016-02-29 63 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) } 
相關問題