原子交易不起作用 - 红宝石轨道

时间:2014-11-25 21:50:21

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

所以我正在尝试在进行保存时实现原子化(基本上是每行的更新)。

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

尽管使用事务块进行保存,我也可以看到部分保存,即其中一行得到更新,而错误的一行(显然)没有(因为我希望更新的行被回滚,因为至少有)由于错误而无法更新的一行。在这种情况下,我对交易块的解释是否正确?如何在我的情况下实现原子保存?

编辑:模型验证其中一列的唯一性,这将是此时数据库中无法更新的原因。

1 个答案:

答案 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

如果你真的需要在失败时“做某事”(除了中止交易),你将不得不使用第一种方法。