2010-05-13 104 views
3

我的應用程序(僅用於本地)上有一個csv導入系統,它逐行解析csv文件並將數據添加到數據庫表。這是基於教程hereRails CSV導入,添加到相關表

require 'csv' 

def csv_import 
    @parsed_file=CSV::Reader.parse(params[:dump][:file]) 
    n = 0 
    @parsed_file.each_with_index do |row, i| 
    next if i == 0 #ignore the first row 
    course = Course.new 
    course.title = row[0] 
    course.unit_code = row[1] 
    course.course_type = row[2] 
    course.value = row[3] 
    course.pass_mark = row[4] 
    if course.save 
     n = n+1 
     GC.start if n%50==0 
    end 
    flash.now[:message] = "CSV Import Successful, #{n} new courses added to the database." 
    end 
    redirect_to(courses_url) 
end 

這是所有在課程控制器和工作正常。 HABTM年和HABTM課程有一段關係。在csv文件中(有效地在行[5]到行[8]中)是year_id。有沒有一種方法可以在上面的方法中添加。我很困惑如何循環4個項目並將它們添加到courses_years表中。

謝謝 傑克

回答

2

您可以在將「正常」數據添加到模型後添加一個簡單的循環,並使用< <方法追加到年份關聯中。

... 
course.value = row[3] 
course.pass_mark = row[4] 
5.upto(8).each do |i| 
    one_year = Year.find(row[i]) 
    course.years << one_year if one_year 
end 
if course.save 
    n = n+1 
... 

您可以在迴路中增加更多的檢查,如果你想確保這些值是有效的,和/或改變查找找到另一種方式的一年。當相關數據被「尾隨關底」像這樣的另一種方法是繼續增加,直到有沒有什麼可以補充,同時也增加了自己多年,如果尚不存在他們:

... 
course.value = row[3] 
course.pass_mark = row[4] 
row[5..-1].each do |year_id| 
    one_year = Year.find_or_create_by_id(year_id) 
    course.years << one_year 
end 
if course.save 
    n = n+1 
... 

有有很多不同的方法可以做到這一點,而且正確的方式實際上取決於您的實際數據,但這是基本方法。

+0

非常好。非常感謝。你有什麼想法在哪裏我可以找到更多關於<<方法?這是很難找到使用谷歌... – Jack 2010-05-13 14:16:21

+1

apidock.com是一個偉大的網站查找鐵軌相關文件。您正在尋找我認爲的ActiveRecord關聯方法:http://apidock.com/rails/ActiveRecord/Associations/ClassMethods – jamuraa 2010-05-13 14:22:24

+0

賓果。偉大的網站。最後一件事。當我使用第二個例子時,服務器似乎陷入循環。我錯過了什麼嗎? – Jack 2010-05-13 14:24:36

1

您是否嘗試過把這些任何一個保存過程之前:

course.years.push(row[5]) 
course.years.push(row[6]) 
course.years.push(row[7]) 
course.years.push(row[8]) 

OR

course.years = [ row[5], row[6], row[7], row[8] ] 

將它保存課程之前。它將填補聯合表courses_years。

編輯

,你得到好像是因爲我們正試圖把ID的,而不是對象的錯誤,我們應該這樣做,而不是:

..... 
    year_array = Year.find(row[5], row[6], row[7], row[8]) 
    course.years << year_array 
    ..... 

後,我們得到了一年的對象,然後我們把它放在協會裏面。之後您可以保存課程對象。

+0

感謝您的回覆。我不斷收到以下錯誤: 年(#2183546760)預計,得到CSV ::單元(#2156593920) 有什麼建議嗎? – Jack 2010-05-13 14:08:16

+1

查看我編輯的答案,我假設年模型數據可用,如果沒有,我們將以不同的方式做。 – 2010-05-13 14:27:05

+0

非常好,歡呼聲。有沒有簡單的方法來循環數組的創建,所以如果一個單元格是空的,它會跳過它? jamuraa已經在他的代碼中嘗試了這個,但它似乎沒有工作。有任何想法嗎? – Jack 2010-05-13 15:05:01