2011-05-04 91 views
3

我正在構建一個應用程序,用戶可以在其中購買跟蹤編號。我有一個訂單模型和一個訂單交易模型。如果訂單事務成功返回從網關,我使用after_save回調觸發一個方法,創建跟蹤號碼並將它們插入到數據庫中。有時用戶只需要訂購一個,但如果他們訂購了多個,我似乎無法獲得創建和插入多條記錄的導軌。While循環在軌中創建多個記錄

這是我正在使用的 - 我從來沒有像這樣使用循環,所以我不知道我做錯了什麼。

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是,你應該使用trackable,而不是@trackable權,但你也應該使用=代替||=。你也可以只使用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

正確 - 我完全錯過了。 – 2011-05-04 21:00:07

+0

這是'|| =' - 謝謝! – Slick23 2011-05-04 21:01:11

+0

這有點晚了,但我最近發現了一個魔術tric,讓創作變得快速。像這樣做:「def create_trackables .... Tracker.transaction do ... * code * ... Tracker.create(something)... end – Automatico 2011-08-18 10:59:16

2

變化@trackabletrackable以保持其作用域爲循環。否則,第二次循環運行時,@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語句中將上面的變量更改爲一個數字來測試,我只是得到了一行它。 「@開始」是問題嗎? – Slick23 2011-05-04 20:52:52