1

前文

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

ビューコードは、プレーヤーに1つ以上のフォームを提示し、リーフアクションごとに選択を要求します。たとえば、上記の場合、アクション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の下で、1つのdynoを使用して実行しているので、シングルスレッドだと思います。

4

1 に答える 1

0

作業する環境によって異なりますが、これがシングルスレッド環境であると仮定しましょう。次に、最初に考えたのは、インスタンス属性を作成して、何かを手動で割り当てて取得することでした。Playerインスタンスがすべての場所で同じ場合、正常に機能します。

Player#id => <some_obj>そうでない場合は、参照を保持するある種のキャッシュであるクラス変数を導入することをお勧めしPlayer#some_objます。Playerself.id

Playerそうすれば、同じ ID を持つすべてのものが同じになることが保証されますsome_obj。また、そのクラスキャッシュをいつ空にするかを決定する必要があります。Railsの場合は、それでafter_filter十分だと思います。

于 2013-01-14T16:48:23.070 に答える