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은 콜백을 처리하는 방법에 대한 예입니다.

당신이 대신 재고 호출 할 수 있습니다

item = Stock.find(stock_id) 

을 수행 할 필요가 없습니다 그것은 당신이

belongs_to :stock 
이상으로 지정했기 때문에 올바른 주식을 찾는 방법을 nows처럼 나는, 몇 가지 다른 일을 변경하는 것이 좋습니다

+0

재생 해 주셔서 감사합니다. 나는 이것을 create.I에서만 확인합니다. 당신이 제안한대로 변경되었지만 여전히 동일합니다. 어딘가에서 내 코드에 실수가 있어야합니다. SystemStackError (스택 수준이 너무 높음) ... – nikos83

+0

공개 레포 인 경우 살펴볼 수 있습니다. –

0

문제는 Tall Paul이 언급 한대로 after_saveattribute_update입니다.

내가 콜백을 사용하지 않으려면 지금

self.update_column(:zysk, 400) 

을 사용하고 있습니다 ... 내 기능 마녀는 데이터를 저장하고 저장 다시하고 다시로드 된 후 한

를 수정했습니다.