2013-06-20 104 views
0

我知道這個代碼不是最優的,有關如何改進它的任何想法?重構這個紅寶石數據庫/續集寶石查找

job_and_cost_code_found = false 
    timberline_db['SELECT Job, Cost_Code FROM [JCM_MASTER__COST_CODE] WHERE [Job] = ? AND [Cost_Code] = ?', job, clean_cost_code].each do |row| 
    job_and_cost_code_found = true 
    end 

if job_and_cost_code_found == false then 
    info = linenum + "," + id + ",,Employees default job and cost code do not exist in timberline. job:#{job} cost code:#{clean_cost_code}" 
    add_to_exception_output_file(info) 
end 

回答

2

你在這裏打破了很多簡單的規則。

不要選擇你不使用的東西。

您選擇多個列,然後完全忽略結果數據。你可能想要的是一個數:

SELECT COUNT(*) AS cost_code_count FROM [JCM_MASTER__COST_CODE] WHERE [Job] = ? AND [Cost_Code] = ?' 

然後你會得到一個row將要麼在它零或非零值。這個保存到像一個變量:

job_and_cost_codes_found = timberline_db[...][0]['cost_code_count'] 

不要拿對false,除非你需要和nil

在Ruby中區分只有兩件事情作爲評價假nilfalse。大多數時候你不會關心這種差異。在極少數情況下,您可能想要設置不同的邏輯集合true,設置爲false或未設置(nil),然後纔可以進行如此明確的測試。

但是,請記住0不是錯誤的值,因此您需要與其進行比較。

考慮到以前的優化,讓您if可能是:

if job_and_cost_codes_found == 0 
    # ... 
end 

不要使用冗餘的語法then或其他位

大部分紅寶石風格導遊摒棄無用的語法像then ,正如他們建議避開for,而是使用更靈活的Enumerable類。

處理數據,而不是字符串

你組裝某種CSV樣線到底有。理想情況下,你會使用built-in CSV library來做正確的編碼,而像那樣的庫需要數據,而不是他們必須解析的字符串。

更近了一步,它是此:

line = [ 
    linenum, 
    id, 
    nil, 
    "Employees default job and cost code do not exist in timberline. job:#{job} cost code:#{clean_cost_code}" 
].join(',') 

add_to_exception_output_file(line) 

你會推測可能與此處適用正確的CSV編碼方法代替join(',')。當你可以提前將所有數據編譯成一個數組數組時,該庫效率更高,所以如果這是最終目標,我建議這樣做。

例如:

lines = [ ] 

# ... 

if (...) 
    # Append an array to the lines to write to the CSV file. 
    lines << [ ... ] 
end 

請像數組,哈希,或自定義對象的標準結構數據,直到你準備把它提交到最終格式化或編碼形式。這樣,如果您需要執行過濾等操作,則可以對其執行其他操作。

+0

優秀的答案。謝謝! – lukemh

0

很難重構這個時候我不完全相信它應該做的,但假設你希望在沒有項目相匹配的作業&代碼對記錄的錯誤,這裏是我想出什麼附:

def fetch_by_job_and_cost_code(job, cost_code) 
    timberline_db['SELECT Job, Cost_Code FROM [JCM_MASTER__COST_CODE] WHERE [Job] = ? AND [Cost_Code] = ?', job, cost_code] 
end 

if fetch_by_job_and_cost_code(job, clean_cost_code).none? 
    add_to_exception_output_file "#{linenum},#{id},,Employees default job and cost code do not exist in timberline. job:#{job} cost code:#{clean_cost_code}" 
end