Ruby .has_key?看似不起作用?

时间:2014-03-11 03:52:09

标签: ruby

这是一个奇怪的问题,因为我可以在PHP中编写看起来完全相同的代码,但工作正常但Ruby没有解释就失败了。如果有人可以提供建议,我会非常高兴。

所以我在Ruby中迭代数据库表。每行都有一个日期字段。我想从这个表中生成一个折线图。因此,如果日期中有30行“1995”,我希望我的哈希最终以"1995": 30作为其内容。然后我可以将这些数据提供给JS图表库。

所以我现在的代码是

 db.execute("SELECT date FROM events") do |row|
      graphdata = {}
      year = row[0][0...4] # Gets first four digits of date, so 1995, 1996, 1997, etc.
      if graphdata.has_key?(year) then
           graphdata[year] += 1
      else
           graphdata[year] = 1
      end
 end

非常简单。如果那一年已经有了一把钥匙,就增加它;如果没有,请使用初始值1创建它。

但我得到的结果是

{"1997"=>1}
{"1997"=>1}
{"1998"=>1}
{"1998"=>1}
{"1998"=>1}
{"1998"=>1}
{"1998"=>1}
{"1998"=>1}

我是Ruby的新手,但我不明白为什么。逻辑似乎完全合理。我甚至在PHP中写了同样的东西,它工作得很好。

$results = $db->query("SELECT date from events order by date asc");
$graphdata= array();
while ($row = mysqli_fetch_row($results)) {
     $year = substr($row[0],0,4);
     if (array_key_exists($year,$graphdata)) {
        $graphdata[$year]++;
        } else {
        $graphdata[$year] = 1;
     }
}

我做错了什么?

2 个答案:

答案 0 :(得分:4)

graphdata = {}放在主循环之外。否则,您将重新初始化为每个新row上的空哈希。

答案 1 :(得分:1)

此外,您可能只使用默认值:

graphdata = Hash.new(0)
db.execute("SELECT date FROM events") do |row|
   year = row[0][0...4] # Gets first four digits of date, so 1995, 1996, 1997, etc.
   graphdata[year] += 1
end