如果 rails 条件失败,则删除一些记录然后回滚
Delete some record and then rollback if condition fails in rails
有问题吗?
我有一个 Rails5
应用程序。我有两个模型。 Team
和 Players
。
他们之间的关联是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
这仅适用于基本属性。如果您有其他模型关系,您也必须使用属性来处理它们。
有问题吗?
我有一个 Rails5
应用程序。我有两个模型。 Team
和 Players
。
他们之间的关联是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
这仅适用于基本属性。如果您有其他模型关系,您也必须使用属性来处理它们。