從CSV

2015-03-31 26 views
0

導入時轉換到這個模型方法時,下列rake任務運行完全從CSV

task :load_scadenze_data => :environment do 
    require 'csv' 

    CSV.foreach("_private/scadenze.tsv", :col_sep => "\t", headers: true) do |row| 

     begin 
     @supplier = Supplier.find_by_code(row[2]) 
     @scadenza = row[0].to_date 
     if (@scadenza <= Date.today) 
     @cweek_payment = 0 
     else 
     @cweek_payment = @scadenza.cweek 
     end 
     Scadenza.create(
      :data_scadenza => row[0], 
      :supplier_id => @supplier.id 
     ) 
     rescue StandardError => e 
     puts "Error importing row because '#{e.message}'" 
     puts row 
     end 
    end 
    end 

然而軌實例變量,

def self.import(file) 
    CSV.foreach(file.path, headers: true) do |row| 

    begin 
    @supplier = Supplier.find_by_code(row[2]) 
    @scadenza = row[0].to_date 
    if (@scadenza <= Date.today) 
    @cweek_payment = 0 
    else 
    @cweek_payment = @scadenza.cweek 
    end 
    Scadenza.create(
     :data_scadenza => row[0], 
     :supplier_id => @supplier.id 
    ) 
    end 
end 

的記錄未導入,因爲 Error importing row because 'Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id'

因此,不知何故,rails框架的行爲是不同的。什麼是處理模型方法的正確方法?

+0

我不認爲你可以用這種方法在類方法中使用實例變量...嘗試通過刪除'@'來轉換你的變量名稱。這會有幫助嗎? – 2015-03-31 09:11:09

+0

在這兩種情況下,實例變量都是不必要的。局部變量應該這樣做。 – 2015-03-31 09:15:45

+0

我試過轉換沒有'@'並且導致相同的結果 – Jerome 2015-03-31 09:16:35

回答

1

在腳本的你「回扣」的版本,你解析CSV:

CSV.foreach("_private/scadenze.tsv", :col_sep => "\t", headers: true) 

但在你的「模式」的版本,還有就是缺少:col_sep選項 - 也許它錯誤地解碼CSV,它有無效值存儲在row[2]因此無法找到合適的Supplier