2012-07-20 3 views
3

을 절약 할 수before_create 아직도 내가 당신의 도움을 주셔서 감사하고 싶습니다 모든 전에

나는이 같은 모델 :이 테이블에 사용자와 제품에 연결이라고 Carted_Products을 주문을 구입하는 저장

attr_protected nil 
    belongs_to :product 
    belongs_to :user 
    before_create :add_ammount 

    def carted_product_price(ammount, price) 
    ammount * price 
    end 

    def add_ammount 
    carted_product = CartedProduct.where(:product_id => self.product_id, :user_id => self.user_id) 
    if carted_product 
     carted_product.first.ammount += self.ammount 
     carted_product.first.update_attributes(:ammount => carted_product.first.ammount) 
    else 
     self.save 
    end 
    end 

그림을

을 작성하기 전에을 실행하기 전에 레코드가 이미 존재하는 경우 컨트롤러가 전달한 ammount를 추가하는 테이블의 레코드를 업데이트하고 싶습니다. , 하나까지 만들어, 지금까지 완료, 그것을 업데이 트하지만, ammount를 업데이 트하지만 순서에 전달 된 매개 변수와 함께 새로운 하나를 생성, 난 단지 레코드를 찾을 때 두 작업을 수행하지 않기를 원합니다

thnx 양해

편집

:

업데이트 속성 후 false를 반환 시도

, 그것은 필터를 취소하고, 작성 해달라고하거나 업데이트는 객체 형태로 저장되는 것을 방지하기 위해 before_create 필터에

답변

5

돌아 false 속성. add_amount은 개체 저장에 대한 책임이 없으므로 save을 단독으로 호출해서는 안됩니다.

+0

이전에 False를 반환하면 업데이트를 만들지 않거나 만들지 않고 그냥 필터를 취소하고 시도해보십시오. thnx tho –

+0

정말입니까? [rails docs] (http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html#label-Canceling+callbacks)는 다음과 같이 말합니다. * before _ \ * 콜백이 false를 반환하면 모든 후속 콜백 및 관련 콜백 작업이 취소됩니다. * – mogelbrod

+0

예, 다른 항목을 저장하지 않고 그냥 되돌릴 때 모든 액션을 취소합니다 : add_amount –

0

before_create 필터에서는이 작업을 수행 할 수 없습니다. create을 호출하는 컨트롤러에서 기존 CartedProduct을 가져와야합니다.