我正在开发Rails中的纸牌游戏服务器。应用程序通过PendingAction
模型的实例树记录玩家应该做的事情。
class Player < ActiveRecord::Base
has_many :cards
has_many :pending_actions
end
在任何时候,玩家都需要对任何叶子PendingAction
采取行动 - 例如,可能有不止一个,
1. End turn
|
+- 2. Do thing A
| |
| + 3. Do thing pre-A
|
+- 4. Do thing B
|
+ 5. Do thing pre-B
视图代码向玩家显示一个或多个表单,请求他们为每个叶子操作选择。例如,在上述情况下,将提出表格以征求行动3和5的意见。
当玩家为行动5做出选择时,该行动将被销毁。但是,处理他们的选择可能会导致他们需要在父(动作4)发生之前做出另一个选择。像这样:
1. End turn
|
+- 2. Do thing A
| |
| + 3. Do thing pre-A
|
+- 4. Do thing B
|
+ 6. Do other thing pre-B
因此需要采取行动4,因此可以将行动6创建为其子女。目前,我只是将动作4作为函数参数传递。但是,我遇到的情况是,能够在before_save
对象的Card
挂钩中访问它真的很有帮助。
存储与Player
相关联的对象的最佳位置在哪里,我可以从与Player
相关的所有模型中访问该对象,该对象在整个 - 但不是超出 - 单个HTTP中有效请求?
我在Heroku下运行,有一个dyno - 所以我相信我是单线程的。
答案 0 :(得分:0)
这取决于您使用的环境,但我们假设这是单线程环境。接下来,首先想到的是创建实例属性以手动分配和检索任何内容。当Player
实例对所有地方都相同时,它将正常工作。
如果没有,我建议引入类变量,某种缓存,将保留Player#id => <some_obj>
引用,并使用辅助访问器,如Player#some_obj
,它将查询Player
的对象self.id
。
通过这种方式,您将确保对于具有相同ID的所有Player
,some_obj
将是相同的。此外,您需要在何时清空该类缓存。对于Rails,我认为after_filter
足够好了。