2011-05-04 93 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