如果 rails 条件失败,则删除一些记录然后回滚

Delete some record and then rollback if condition fails in rails

有问题吗?

我有一个 Rails5 应用程序。我有两个模型。 TeamPlayers。 他们之间的关联是has_many & belongs_to

class Team < ApplicationRecord
  has_many :players
end


class Player < ApplicationRecord
  belongs_to :team
end

现在,我想在更新 team 模型之前执行 destroy 个玩家。条件如下

def update
  @team.players.destroy_all if a
  ........
  if b
  .... some code.....
  elsif c
    @team.players.destroy_all
  end
  if @team.update_attributes(team_params)
    redirect_to teams_path
  else
  ... some code..
    render :edit
  end
end

备注

team_params 中,我有 players_attributes,所以每次如果有新条目,我需要删除所有旧条目,然后 @team.update_attributes 将在 [= 中插入条目22=].

预期

如果 @team.update_attributes(team_parmas) 失败,则 @team.players 应该 回滚

我尝试过的东西

我尝试在 update 方法的第一行添加 Transactions 但它不起作用。

您可以使用 gem 之类的文件记录来保留历史记录,但 rails 的性质是提交后无法回滚事务。模拟这个的一种方法是将属性保存在临时的哈希集合中,并在您再次需要记录时重新保存它们。你可以有这样的逻辑

team_players = @team.players.map(&:attributes)

那么如果你需要'roll back'

team_players.each do |team_player|
    TeamPlayer.create(team_player)
end

这仅适用于基本属性。如果您有其他模型关系,您也必须使用属性来处理它们。