2017-01-25 4 views
0

レコードを保存した後に利益を計算する関数をほとんど作成しようとしていません。 は私が3つのコントローラと3つのモデルを持っている:私はセルズテーブルに保存した後に、データベース内のいくつかの計算を保存したい Rails 4モデルで変数を使用した保存後の関数

証券

BELONGS_TO、購入、売却、証券 購入をして売ります。 だから私は販売モデルで

class Sell < ActiveRecord::Base 
belongs_to :stock 
after_save :calculate_selled_stock, :reset_to_zero, :calculate_benefit 
before_save :check_amount 

#validate :validate_amount 
validates :amount, numericality: { only_integer: true, greater_than_or_equal: 0 } 



private 

    def calculate_benefit 
    self.update_attribute(:zysk, 400) 
    end 


    def calculate_selled_stock 
     Stock.find(stock_id) 
     stock.increment! :value, totalprice 
     stock.decrement! :amount, amount 
    end 

    def check_amount 
    item = Stock.find(stock_id) 

    return false unless item 
    errors.add(:amount, "Error message") 
    item.amount_available?(self.amount) 

    end 



    def reset_to_zero 
    item = Stock.find(stock_id) 
    item.update_attributes(:amountvalue => 0, :amoutbuys => 0) if item.amount_zero?(self.amount) 
    end 

end 

ことをやろうでした。しかし、あなたが作成しようとした後、それが無限ループのために行くだろう。 これを変更したり、いくつかの変数を追加するにはどうすればよいですか?あなたがafter_save方法をキックオフあなたの在庫を更新し続けるので、私はあなたが問題に実行されていると信じて

def calculate_benefit 
var1 = 400 
var2 = var1*20 
self.update_attribute(:zysk, var2) 
end 

答えて

0

です。私は単純な変更はafter_saveafter_updateに変更することだと思います。

この問題を解決するには他の方法があります。これらのコールバックフックは実際に問題を引き起こし、回避策を見つけることに不満を抱かせる可能性があるため、それらを調べることをおすすめします。 Hereは、コールバックの処理方法の例です。

あなたは、あなただけではなく、株式を呼び出すことができますし、

belongs_to :stock 
上で指定されたので、それが正しいの在庫を見つける方法Nowsの

item = Stock.find(stock_id) 

を行う必要はありませんように私は、いくつか他のものを変更することをお勧めします

+0

リピートに感謝します。私は作成時にのみこれをチェックします。あなたが提案したとおりに変更しましたが、それはまだ同じです。私のコードのどこかで間違いがあります。 SystemStackError(スタックレベルが深すぎる)... – nikos83

+0

これが公開リポジトリの場合は、 –

0

この問題は、Tall Paul氏の言葉通りにafter_saveattribute_updateとなっています。

私はコールバックを使用しないようになりました

self.update_column(:zysk, 400) 

を使用しています...私の機能の魔女がデータを保存し、保存が何度も何度もロードされた後にされた

を変更しました。

関連する問題