在哪里存储请求期限的值

时间:2013-01-14 15:42:42

标签: ruby-on-rails-3

序言

我正在开发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 - 所以我相信我是单线程的。

1 个答案:

答案 0 :(得分:0)

这取决于您使用的环境,但我们假设这是单线程环境。接下来,首先想到的是创建实例属性以手动分配和检索任何内容。当Player实例对所有地方都相同时,它将正常工作。

如果没有,我建议引入类变量,某种缓存,将保留Player#id => <some_obj>引用,并使用辅助访问器,如Player#some_obj,它将查询Player的对象self.id

通过这种方式,您将确保对于具有相同ID的所有Playersome_obj将是相同的。此外,您需要在何时清空该类缓存。对于Rails,我认为after_filter足够好了。