While循环在轨中创建多个记录
问题描述:
我正在构建一个应用程序,用户可以在其中购买跟踪编号。我有一个订单模型和一个订单交易模型。如果订单事务成功返回从网关,我使用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
答
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
答
变化@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
+0
它似乎仍然只保存一行......我甚至在while语句中将上面的变量更改为一个数字来测试,我只是得到了一行它。 “@开始”是问题吗? – Slick23 2011-05-04 20:52:52
正确 - 我完全错过了。 – 2011-05-04 21:00:07
这是'|| =' - 谢谢! – Slick23 2011-05-04 21:01:11
这有点晚了,但我最近发现了一个魔术tric,让创作变得快速。像这样做:“def create_trackables .... Tracker.transaction do ... * code * ... Tracker.create(something)... end – Automatico 2011-08-18 10:59:16