Rails还是比较新的。在一个小组项目上工作以构建一个国际象棋应用程序,除了我们的将死中的事务回滚之外,我们已经完成了所有工作?方法
移动直接保存到数据库中。然后,我们检查?方法查询数据库以查看国王是否在检查中。这给我们带来了一个问题,原因有两个:1。如果你自己动手检查,那么移动必须撤消2.要确定你是否需要在棋盘上移动棋子并查看国王是否还在检查中。我们实现了问题1的交易,并且工作正常。
然而,对于将死的我们检查的第一件事是看看国王是否可以让自己不受检查。这种方法贯穿国王可能占据的9个方格,看看是否有人成功地将他从检查中移开。我知道这个方法现在有点草率,但我们试图让它工作然后我们可以重构。
我们的目标是移动国王,看看是否让他失去了检查,然后回滚此举。回滚应该每次都发生,但回滚永远不会发生。
# determine if king can move himself out of check
def can_move_out_of_check?
success = false
y_start = y_position
((x_position - 1)..(x_position + 1)).each do |x|
((y_start - 1)..(y_start + 1)).each do |y|
Piece.transaction do
move_to(x, y) if valid_move?(x, y)
# if game.check?(color) comes up false,
# even once, assign true
success = true unless game.check?(color)
# reset any attempted moves
fail ActiveRecord::Rollback
end
end
end
success
end
我尝试了不同的选项King.transaction
ActiveRecord::Base.transaction
。根据一项建议,我尝试ActiveRecord::Base.transaction(require_new: true)
在每张支票上回滚,但也不允许我在国王检查时做出有效的举动。
我觉得我错过了一些非常简单的东西。
答案 0 :(得分:1)
工作配置为:
def can_move_out_of_check?
success = false
y_start = y_position
ActiveRecord::Base.transaction do
((x_position - 1)..(x_position + 1)).each do |x|
((y_start - 1)..(y_start + 1)).each do |y|
move_to(x, y) if valid_move?(x, y)
# if game.check?(color) comes up false,
# even once, assign true
success = true unless game.check?(color)
# reset any attempted moves
fail ActiveRecord::Rollback
end
end
end
success
end
哪个会起作用,因为所有事情都发生在同一个交易中。