2013-08-04 75 views
1

我有一個txt文件全屬性,像這樣:耙數據導入任務並沒有更新正確

"12345", "1", "Kent" 
"67890", "1", "New Castle" 

我需要它來更新我的縣的模式,所以我有這個rake任務:

namespace :data do 
    desc "import data from files to database" 
    task :import => :environment do 
    file = File.open(File.join(Rails.root, "lib", "tasks", "counties.txt"), "r") 
    file.each do |line| 
     attrs = line.split(", ") 
     c = County.find_or_initialize_by_number(attrs[0]) 
     c.state_id = attrs[1] 
     c.name = attrs[2] 
     c.save! 
    end 
    end 
end 

一切似乎很好,但是當我在控制檯檢查,以確保它是正確導入,我得到這個:

#<County id: 2, name: nil, number: 0, state_id: 0, created_at: "2013-08-04 17:44:11", updated_at: "2013-08-04 17:44:11"> 

我知道它實際上是在導入一些東西,因爲它已經創建了正確數量的County記錄,但實際上並沒有正確更新屬性。我確定我錯過了一些非常明顯的東西,但我找不到它!

+0

您是否嘗試過在控制檯中執行這些步驟? – mathieugagne

+0

after_save或類似的東西有任何回調嗎? – mathieugagne

+0

剛剛發現了一些東西:當我將數據更改爲這樣讀取時:54109,5,「懷俄明州」即刪除整數週圍的引號,然後它會更新。所以我的問題是它讀取引號,然後不更新整數字段。有沒有更好的方法來編寫line.split? – krstck

回答

0

假設:County.number被定義爲一個整數字段。

attrs [0]你的line.split出來後是「\」12345 \「」(一個字符串)。 find_by方法默認查找鍵爲0(整數),因爲它正在查找整數字段(數字)。這將解釋爲什麼您的代碼在手動刪除文本文件中第一個數據列的引號時會起作用。

基於此根本原因,可能有多種方法可以解決您的問題。這是一個醜陋的方式:

c = County.find_or_initialize_by_number(Integer(attrs[0].gsub(/\"/, ''))) 

理想情況下,我會修剪出(或gsub)引號時做行文本拆分。

+0

County.number是一個整數,以及state_id。但出於某種原因,刪除報價只能使用一次。當我從文本文件最後一行的第二個數據列中刪除它時,它工作正常,但從第一列刪除時不起作用。 – krstck

+0

另外,當我從文本文件中刪除所有引號時,根本沒有任何反應。 – krstck

+0

我仍然不知道爲什麼它在這種情況下不起作用,但我最終刪除了我的County模型並重新創建了它,然後運行刪除了所有引號的rake任務。工作很好! – krstck