1

前言

我正在 Rails 中开发纸牌游戏服务器。该应用程序通过模型实例树记录玩家应该做什么PendingAction

class Player < ActiveRecord::Base
  has_many :cards
  has_many :pending_actions
end

在任何时候,玩家都需要对任何叶子PendingActions 进行操作——可能不止一个,例如:

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

问题

存储与 a 关联的对象的最佳位置在哪里Player,我可以从与 that 相关的所有模型中访问该对象Player,这在整个 HTTP 请求中都有效——但不能超出——单个 HTTP 请求?

我在 Heroku 下运行,有 1 个测功机 - 所以我相信我是单线程的。

4

1 回答 1

0

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

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

这样,您将确保所有Player具有相同 IDsome_obj的人都是相同的。此外,您需要决定何时清空该类缓存。对于 Rails,我想after_filter已经足够好了。

于 2013-01-14T16:48:23.070 回答