[英]Calculation in model failing for rake task
我在模型中設置了方法/操作/代碼段(我總是對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任務,將經常性預算列表寫到預算表中(這樣我就可以每月計划一次)。 但是,當我從終端運行此任務時,它將遇到錯誤。
耙任務。
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)
值得注意的是,當我從模型中刪除該方法時,任務會很好地寫入預算表。
有人有想法么?
這是因為您試圖從amount
minus
nil
update_budget
稱為before_save callback
-在這里你計算amount_remaining
與減去amount_spent
從amount
你的情況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
值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.