所以我正在尝试在进行保存时实现原子化(基本上是每行的更新)。
params[:player_types].each do |p_type_params|
if p_type_params[:id]
player = @player_types.find(p_type_params[:id])
player.assign_attributes(p_type_params)
@player_types << player
end
end
ActiveRecord::Base.transaction do
@player_types.each do |player_type|
if player_type.save
"DO Something.."
else
"DO something else.."
errors = true
end
end
end
尽管使用事务块进行保存,我也可以看到部分保存,即其中一行得到更新,而错误的一行(显然)没有(因为我希望更新的行被回滚,因为至少有)由于错误而无法更新的一行。在这种情况下,我对交易块的解释是否正确?如何在我的情况下实现原子保存?
编辑:模型验证其中一列的唯一性,这将是此时数据库中无法更新的原因。
答案 0 :(得分:1)
您需要在事务块中引发错误以中止事务;设置errors
不会影响交易。
例如:
ActiveRecord::Base.transaction do
@player_types.each do |player_type|
if player_type.save
"DO Something.."
else
"DO something else.."
raise "save failed!"
end
end
end
当然,更常规的做法是使用save!
在失败时为您引发异常:
ActiveRecord::Base.transaction do
@player_types.each do |player_type|
player_type.save!
end
end
如果你真的需要在失败时“做某事”(除了中止交易),你将不得不使用第一种方法。