$ ruby -v; rails -v; grep DESCR /etc/lsb-release; psql --version
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-linux]
Rails 4.2.0
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"
psql (PostgreSQL) 9.5.5
我正在使用CSV.foreach(path, {headers: :first_row}) do |row|
迭代.csv文件。我的数据中的一列是Yes / No-ish,我在创建记录之前将其转换为true
/ false
。现在,我使用这两行代码,但它们对我来说不够优雅。更令人担忧的是,他们似乎指出我从根本上不了解如何在红宝石中正确使用积木。
同样,这些工作还不错:
temp = row.fetch("Header42") # { |something| could be processed here... }
column = (temp.nil? || !(temp.downcase.eql? "yes")) ? false : true
......但我看起来要少一些。我尝试了这个并最终得到了未翻译的字符串而不是所需的布尔值:
column = row.fetch("Header42") { |r| (r.nil? || !(r.downcase.eql? "yes")) ? false : true }
在街区玩puts
时,我似乎无法解决这个问题 - 更不用说给我预期的任务价值了。
I'm using this as my documentation for CSV::Row.fetch(){}
非常感谢!
答案 0 :(得分:0)
Row.fetch(header)抓取给定标头字符串的字段。如果该字段不存在,则然后调用该块,并为该块提供标题字符串。文档实际上是这样说的,尽管它确实有点令人困惑。在我理解之前,我必须阅读源代码。
如果存在具有给定标头的字段,则返回其值。否则,如果给出了一个块,则会产生标题并返回其结果。
如果您想使代码雄辩和健壮,请尝试使用default参数,该参数在找不到标题时返回:
column = (row.fetch("Header42", false)) && (temp.downcase == "yes")
如果您不希望找不到标题,您可以放弃:
column = row.fetch("Header42") && temp.downcase == "yes"