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