0

データのハイブリッドへのインターフェイスとして機能する Rails アプリケーションがあります。私が必要とする情報のほとんどは、XML-RPC を使用してコマンド行プログラムから取得されます。これとは別に、データベースに保存するしかない追加のデータが必要です。このため、アプリケーションを設計する最善の方法を見つけるのに苦労しています。

XML-RPC を使用してプログラムから取得した適切なデータにそのインスタンス変数を定義することにより、オブジェクトの呼び出しに依存し、オブジェクトを「強化」するようにオーバーライドself.allしました。self.find(id)super

ただし、これはすべてかなり複雑に思えます。たとえば、魔法のファインダー ( find_by_x) を使用する能力を失ったとします。これにより、他の何かが壊れるかどうかはわかりません。

私の質問は、これを行うためのより論理的で賢明な方法があるかどうかです。つまり、ほとんどのデータを XML-RPC に依存するアプリケーションを設計するだけでなく、データベースに格納された一部のデータも設計します。

について読みましafter_findた。このコールバックを使用して、「オブジェクト エンリッチ」プロセスを実装し、レコードが見つかったときにいつでも実行できるようにします。ただし、アイテムに関連付けられたデータを取得する方法は、すべてのアイテム データを取得する方法とは異なります。すべてのアイテム データを取得する方法 ( ) は、 1 つのアイテムのデータself.allのみを取得する方法 ( ) よりもはるかに効率的ですが、残念ながら適用できません。コールバックを呼び出しに適用しないようにする方法があれば、これはうまく機能します。self.findself.all

4

1 に答える 1

2

私の経験では、ActiveRecord のファインダーをいじってはいけません。それらが依存している魔法はたくさんあります。

after_find最初は素晴らしい方向ですが、バッチ処理に問題がある場合は、2 つの方法をお勧めします。キャッシング レイヤーを使用し、バッチ処理alias_method_chainされた#allXML-RPC 検索を実行してキャッシュし、次に、呼び出しをエイリアス化されていないオリジナルに渡しallます。次に、after_find最初にキャッシュのデータをチェックし、そこにない場合はリモート検索を実行します。allこれにより、コールバックを利用しながら、検索のデータを正常にバッチ処理できます。

とはいえ、おそらくこれを行う簡単な方法があります。ActiveRecord::Baseから派生するのではなく、いくつかの XMLRPC ベース インターフェイスから派生するモデルを使用し、AR インスタンスとデータベース情報を指す偽の関連付けをそれらに持たせます。したがって、次のようなものがあります。

class XmlRpcModelBase
  ...

  def find(...)
  end

  def all(...)
  end

  def extra_data
    @extra_data ||= SomeActiveRecordModel.find(...)
  end
end

class Foo < XmlRpcModelBase

end

それは理想的ではなく、正直なところ、これがどれだけ読み取られるか、およびどれだけが読み取り/書き込みであるかに大きく依存しますが、可能であれば ActiveRecord の邪魔にならないようにして、代わりに AR- をボルトで固定します-必要に応じて関連する部分。

于 2010-12-05T01:33:46.820 に答える