你在這裏打破了很多簡單的規則。
不要選擇你不使用的東西。
您選擇多個列,然後完全忽略結果數據。你可能想要的是一個數:
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中區分只有兩件事情作爲評價假,nil
和false
。大多數時候你不會關心這種差異。在極少數情況下,您可能想要設置不同的邏輯集合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
請像數組,哈希,或自定義對象的標準結構數據,直到你準備把它提交到最終格式化或編碼形式。這樣,如果您需要執行過濾等操作,則可以對其執行其他操作。
優秀的答案。謝謝! – lukemh