невозможно суммировать итерацию с плавающей точкой - PullRequest
0 голосов
/ 08 апреля 2019

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, где мне нужно игнорировать заголовки, например, в моем блоке get_amt.each.

Я хочу sum столбец Amount для Type.Но я сталкиваюсь с 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

1 Ответ

0 голосов
/ 08 апреля 2019
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.переменная должна быть снабжена row и column из определенного значения, которое используется INSERT.Следовательно get_amt[1][0] Или первая строка (следующая строка после строки заголовков) и первый столбец.

...