2011-05-24 95 views
0

我試圖限制我執行mysql查詢的次數,因爲這可能最終導致2k +查詢只是爲了實現相當小的結果。在已經檢索到的mysql結果中搜索

我正在瀏覽一個CSV文件,我需要檢查csv中的內容格式是否符合db的預期格式,有時我會嘗試完成一些基本的清理工作(例如,I有一個字段是一個字符串,但有時在csv中是jb2003-343,我需要刪除-343)。

我做的第一件事就是從數據庫中獲取我需要從csv中檢索的字段列表,然後獲取csv中這些列的索引,然後檢查csv中的每一行並得到每個索引列

 
get_fields = BaseField.find_by_group(:all, :conditions=>['group IN (?)',params[:group_ids]]) 

csv = CSV.read(csv.path) 
first_line=csv.first 
first_line.split(',') 
csv.each_with_index do |row| 
    if row==0 
    col_indexes=[] 
    csv_data=[] 
    get_fields.each do |col| 
     col_indexes << row.index(col.name) 
    end 
    else 
     csv_row=[] 
     col_indexes.each do |col| 
      #possibly check the value here against another mysql query but that's ugly 
     csv_row << row[col] 
     end 
     csv_data << csv_row 
    end 

end 

的問題是,當我加入了csv_data輸出的內容,我不再有原來的get_fields查詢的任何連接。因此,我似乎無法說'這是否與數據庫預期的數據類型匹配'。

我可以工作,我回來的路上經過這讓我到那個水平相同的過程,並作出這樣

 
get_cleanup = BaseField.find_by_csv_col_name(first_line[col]) 
    if get_cleanup.format==row[col].is_a 
    csv_row << row[col] 
    else 
    # do some data clean-up 
    end 

另一個查詢,但正如我所說,這可能意味着該get_cleanup運行2000+次。

而不是這樣做,有沒有辦法在原始的get_fields結果中搜索名稱,然後獲取關聯的字段?

我試着搜索'搜索欄對象',但不斷搜索有關構建搜索的結果,而不是在現有對象內搜索。

我知道我可以做array.search,但沒有看到關於搜索的對象api中的任何東西。

注意:上面的代碼可能並不完美,因爲我還沒有運行它,只是寫下了我的頭頂,但希望它給你我想要的東西的想法。

回答

1

當您填充col_indexes數組而不是存儲單個值時,可以存儲包含索引和數據類型的散列。

get_fields.each do |col| 
    col_info = {:row_index = row.index(col.name), :name=>col.name :format=>col.format} 
    col_indexes << col_info 
end 

然後,您可以訪問該for loop

所有數據