你在这里打破了很多简单的规则。
不要选择你不使用的东西。
您选择多个列,然后完全忽略结果数据。你可能想要的是一个数:
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