rake 任务的模型计算失败

Calculation in model failing for rake task

我在我的模型中设置了 method/action/piece 代码(我总是对 rails 的术语有点迷惑),以便在我输入新的预算时更新预算中的剩余金额广告。

class Budget < ActiveRecord::Base
belongs_to :client
has_many :adverts
before_save :update_budget

validates :name, :amount, :client_id, presence: true

def update_budget
    self.amount_remaining = self.amount - self.amount_spent
end
end

这在更新我的预算或输入新广告时效果很好。一切正常。但是,我已经写了一个 rake 任务,将经常性预算列表写入预算 table(这样我就可以每月安排一次)。但是,当我 运行 从终端执行此任务时,它 运行 出错了。

rake 任务。

desc "Recurring Updates"
task :recurring_budgets => :environment do
    @recurring_budgets = RecurringBudget.all
    @recurring_budgets.each do |recurring_budget|
        Budget.create(name: recurring_budget.name, amount: recurring_budget.amount, client_id: recurring_budget.client_id)
    end
end

错误。

$ rake recurring_budgets
rake aborted!
TypeError: nil can't be coerced into Fixnum
/Users/tomgamon/projects/adsman/app/models/budget.rb:9:in `-'
/Users/tomgamon/projects/adsman/app/models/budget.rb:9:in `update_budget'
/Users/tomgamon/projects/adsman/lib/tasks/recurring_budgets.rake:6:in `block (2 levels) in <top (required)>'
/Users/tomgamon/projects/adsman/lib/tasks/recurring_budgets.rake:5:in `block in <top (required)>'
Tasks: TOP => recurring_budgets
(See full trace by running task with --trace)

值得注意的是,当我从我的模型中删除该方法时,任务写入预算 table 正常。

有人有什么想法吗?

这是因为您试图从 amount

minus nil

update_budgetbefore_save callback 中调用 - 在这里你通过从 amount 中减去 amount_spent 来计算 amount_remaining 在你的情况下 amount_spentnil,所以当你尝试从某个东西中减去 nil 值时,你会得到这个错误 - TypeError: nil can't be coerced into Fixnum

这个有两种解决方法-

1 - 如果 amount_spentnil 你必须使用 0

def update_budget
    self.amount_remaining = self.amount - (self.amount_spent || 0)
end

2 - 您可以在迁移中将 amount_remainingamountamount_spent 的默认值设置为 0(零)。

最好为这些字段设置默认值,而不是在代码中检查 nil 值。