簡體   English   中英

瑞克任務失敗的模型計算

[英]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_spentamount你的情況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值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM