2011-05-04 3 views
3

사용자가 추적 번호를 구매할 수있는 응용 프로그램을 구축 중입니다. 주문 모델과 주문 거래 모델이 있습니다. Order Transaction이 성공적으로 게이트웨이에서 리턴되면, after_save 콜백을 사용하여 추적 번호를 생성하고이를 데이터베이스에 삽입하는 메소드를 트리거합니다. 때로는 사용자가 하나를 주문하는 경우도 있지만, 둘 이상의 주문을하는 경우 레일을 만들어서 둘 이상의 레코드를 만들고 삽입 할 수없는 것처럼 보일 수 있습니다.레일에 여러 레코드를 만드는 while 루프

다음은 내가 사용하고있는 것입니다. 나는 이런 루프를 사용자에게 제공하지 않았으므로 내가 잘못하고있는 것이 확실하지 않습니다. trackable

def create_trackables 
     if self.success == true 
     @order = Order.find(order_id) 
     @start = 0 
     while @start < @order.total_tokens 
      @trackable_token = Tracker.create_trackable_token 
      @start += 1 
      @trackable ||= Tracker.new(
      :user_id => @current_user, 
      :token => @trackable_token, 
      :order_id => order_id 
      ) 
     @trackable.save 
     end 
     end 
    end 

답변

6

dmarkow는 대신 @trackabletrackable를 사용해야 옳다 그러나 당신은 또한 ||= 대신 =를 사용한다. create도 사용할 수 있습니다. 내가 쓸 방법은 다음과 같습니다.

def create_trackables 
    return unless self.success 
    order = Order.find(order_id) #you shouldn't need this line if it has_one :order 
    1.upto(order.total_tokens) do 
     Tracker.create!(
        :user_id => @current_user, 
        :token => Tracker.create_trackable_token, 
        :order_id => order_id 
        ) 
    end 
    end 

+0

맞음 - 완전히 빠졌습니다. –

+0

그것은'|| ='- 감사합니다! – Slick23

+0

조금 늦었지 만 창조를 빠르게하는 마술 적 트릭을 새로 발견했습니다. "def create_trackables .... Tracker.transaction do ... * code * ... Tracker.create (something) ... end – Automatico

2

변경 @trackable는 루프로 범위를 유지합니다. 그렇지 않으면 루프가 두 번째로 실행될 때 @trackable에는 이미 값이 있으므로 Tracker.new에 대한 호출이 실행되지 않으며 @trackable.save 행은 동일한 레코드를 다시 저장합니다. (편집 : 또한 ||=을 제거하고 = 만 사용하십시오.)

def create_trackables 
    if self.success == true 
    @order = Order.find(order_id) 
    @start = 0 
    while @start < @order.total_tokens 
     @trackable_token = Tracker.create_trackable_token 
     @start += 1 
     trackable = Tracker.new(
     :user_id => @current_user, 
     :token => @trackable_token, 
     :order_id => order_id 
     ) 
     trackable.save 
    end 
    end 
end 
+0

여전히 한 행만 저장하는 것 같습니다. while 문에서 upper 변수를 테스트 할 숫자로 변경하고 방금 한 행을 꺼냅니다. 그것. '@ start'가 문제일까요? – Slick23