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_budget
在 before_save callback
中调用 - 在这里你通过从 amount
中减去 amount_spent
来计算 amount_remaining
在你的情况下 amount_spent
是 nil
,所以当你尝试从某个东西中减去 nil
值时,你会得到这个错误 - TypeError: nil can't be coerced into Fixnum
这个有两种解决方法-
1 - 如果 amount_spent
是 nil
你必须使用 0
def update_budget
self.amount_remaining = self.amount - (self.amount_spent || 0)
end
或
2 - 您可以在迁移中将 amount_remaining
、amount
和 amount_spent
的默认值设置为 0
(零)。
最好为这些字段设置默认值,而不是在代码中检查 nil
值。
我在我的模型中设置了 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_budget
在 before_save callback
中调用 - 在这里你通过从 amount
中减去 amount_spent
来计算 amount_remaining
在你的情况下 amount_spent
是 nil
,所以当你尝试从某个东西中减去 nil
值时,你会得到这个错误 - TypeError: nil can't be coerced into Fixnum
这个有两种解决方法-
1 - 如果 amount_spent
是 nil
你必须使用 0
def update_budget
self.amount_remaining = self.amount - (self.amount_spent || 0)
end
或
2 - 您可以在迁移中将 amount_remaining
、amount
和 amount_spent
的默认值设置为 0
(零)。
最好为这些字段设置默认值,而不是在代码中检查 nil
值。