无法对浮点迭代求和
unable to sum a float iteration
ruby -v 2.3.7
(sqlite3 与较新的 ruby -v 存在兼容性问题)
sqlite3 -v 3.22
sqlite -v 2.8
lsb_release -a 18.04
我已经尽可能地压缩了代码。
def some_method(info_hash)
...
db.results_as_hash = true
sum = 0
db.transaction
db.execute2 "CREATE table if not exists a_table(Id INT PRIMARY KEY, Type TEXT, Month TEXT, Amount FLOAT, TOTAL FLOAT)"
db.execute2 "INSERT into a_table(Type, Month, Amount) values(:Type , :Month , :Amount)", info_hash[:category], info_hash[:month], info_hash[:amount]
get_amt = db.prepare "SELECT Amount from a_table WHERE Type = :Type"
get_amt.execute info_hash[:category]
get_amt.each do |g|
sum += g #here I get a NoMethodError for Nil:NilClass
end
db.execute2 "INSERT into bills(Total) values(:sum)", sum
db.commit
...
end
我主要使用execute2
方法。我依赖 execute
方法,我需要忽略 headers,例如在我的 get_amt.each
块中。
我想 sum
Type
的 Amount
列。但是我 运行 变成 NoMethodError
当我 运行 我的 block
.
完整的错误是:
undefined method '+' for nil:NilClass (NoMethodError)
请指教我哪里做错了
编辑:
我重写了代码以反映@Shawn 的建议:
def some_method(info_hash)
...
db.transaction
db.execute2 "CREATE table if not exists a_table(Id INTEGER PRIMARY KEY, Type TEXT, Month TEXT, Amount FLOAT, Total FLOAT)"
db.execute2 "INSERT into a_table(Type, Month, Amount) values(:Type , :Month , :Amount)", info_hash[:category], info_hash[:month], info_hash[:amount]
get_amt = db.execute2 "SELECT sum(Amount) from a_table WHERE Type = :Type", info_hash[:category]
db.execute2 "INSERT into a_table(Total) values(:get_amt)", get_amt
db.commit
...
end
这会产生 sqlite3 Exception
Index out of range
db.execute2 "INSERT into a_table(Total) values(:get_amt)", get_amt[1][0]
本质上语句 get_amt = db.execute2 "SELECT sum(Amount) from a_table WHERE type = :type", hash_info[category]
将超过 1 个值写入 get_amt
变量。
必须为变量提供 INSERT
使用的 特定 值的 row
和 column
。因此 get_amt[1][0]
或第一行(headers 行之后的下一行)和第一列。
ruby -v 2.3.7
(sqlite3 与较新的 ruby -v 存在兼容性问题)
sqlite3 -v 3.22
sqlite -v 2.8
lsb_release -a 18.04
我已经尽可能地压缩了代码。
def some_method(info_hash)
...
db.results_as_hash = true
sum = 0
db.transaction
db.execute2 "CREATE table if not exists a_table(Id INT PRIMARY KEY, Type TEXT, Month TEXT, Amount FLOAT, TOTAL FLOAT)"
db.execute2 "INSERT into a_table(Type, Month, Amount) values(:Type , :Month , :Amount)", info_hash[:category], info_hash[:month], info_hash[:amount]
get_amt = db.prepare "SELECT Amount from a_table WHERE Type = :Type"
get_amt.execute info_hash[:category]
get_amt.each do |g|
sum += g #here I get a NoMethodError for Nil:NilClass
end
db.execute2 "INSERT into bills(Total) values(:sum)", sum
db.commit
...
end
我主要使用execute2
方法。我依赖 execute
方法,我需要忽略 headers,例如在我的 get_amt.each
块中。
我想 sum
Type
的 Amount
列。但是我 运行 变成 NoMethodError
当我 运行 我的 block
.
完整的错误是:
undefined method '+' for nil:NilClass (NoMethodError)
请指教我哪里做错了
编辑: 我重写了代码以反映@Shawn 的建议:
def some_method(info_hash)
...
db.transaction
db.execute2 "CREATE table if not exists a_table(Id INTEGER PRIMARY KEY, Type TEXT, Month TEXT, Amount FLOAT, Total FLOAT)"
db.execute2 "INSERT into a_table(Type, Month, Amount) values(:Type , :Month , :Amount)", info_hash[:category], info_hash[:month], info_hash[:amount]
get_amt = db.execute2 "SELECT sum(Amount) from a_table WHERE Type = :Type", info_hash[:category]
db.execute2 "INSERT into a_table(Total) values(:get_amt)", get_amt
db.commit
...
end
这会产生 sqlite3 Exception
Index out of range
db.execute2 "INSERT into a_table(Total) values(:get_amt)", get_amt[1][0]
本质上语句 get_amt = db.execute2 "SELECT sum(Amount) from a_table WHERE type = :type", hash_info[category]
将超过 1 个值写入 get_amt
变量。
必须为变量提供 INSERT
使用的 特定 值的 row
和 column
。因此 get_amt[1][0]
或第一行(headers 行之后的下一行)和第一列。