while循环在rails中创建多个记录

时间:2011-05-04 20:39:57

标签: ruby-on-rails ruby ruby-on-rails-3

我正在构建一个用户可以购买跟踪号的应用程序。我有一个订单模型和一个订单交易模型。如果订单事务从网关成功返回,我使用after_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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

@trackable更改为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