这是一个奇怪的问题,因为我可以在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;
}
}
我做错了什么?
答案 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