基本上我有这个用户模型,它具有某些属性,例如'health'和另一个 Battle 模型,它记录用户之间的所有争斗。用户可以互相争斗,一些概率将决定谁获胜。两人在战斗后都会失去健康。
所以在 Battle 控制器中,我做了'CREATE'动作,
@battle = Battle.attempt current_user.id, opponent.id
在战斗模型中,
def self.attempt current_user.id, opponent_id
battle = Battle.new({:user_id => current_user.id, :opponent_id => opponent_id})
# all the math calculation here
...
# Update Health
...
battle.User.health = new_health
battle.User.save
battle.save
return battle
end
回到战斗控制器,我做了......
new_user_health = current_user.health
在战斗后获得新的健康值。然而,我得到的值是旧的健康值(战斗前的健康值)。
在???之前有没有人遇到过这种问题
更新
我只是添加
current_user.reload
行前
new_user_health = current_user.health
这是有效的。问题解决了。谢谢!
答案 0 :(得分:4)
您似乎获得current_user
,然后更新battle.user
,然后期望current_user
自动获得更新的值。使用Rails'Identity Map可以做到这种类型的事情,但有一些警告你首先想要阅读。
问题在于,即使两个对象由数据库中的相同数据支持,内存中也有两个对象。要刷新信息,您可以拨打current_user.reload
。
作为旁注,这不会被归类为竞争条件,因为您没有使用多个进程来修改/读取数据。在此示例中,您正在读取数据,然后更新内存中不同对象的数据。如果您使用两个线程同时访问相同的信息,则可能发生竞争情况。
此外,您应该使用battle.user
,而不是像评论中提到的Wayne那样battle.User
。