2

metric私は現在、自分の Rails アプリに modelsとoperandを持つ計算構造を持っていますoperation_type

現在、metricモデルには多くのがあり、 (合計、乗算など) にoperands基づいて計算を実行でき、それぞれが右または左として定義されます (つまり、演算が除算の場合、分子と分母を識別できるように) )。operation_typeoperand

現在、オペランドは常に何らかのモデルの属性です@customer.sales.selling_price.sum

これをスケーラブルにするためには、オペランドを何らかの属性にするか、前の操作の結果にする必要があります。つまり、オペランドをメトリックにすることができます

私のモデルが現在どのように見えるかの図を含めました:

ここに画像の説明を入力

オペランドを実際のオペランドまたは別のメトリックにできる最もエレガントな方法を教えてくれる人はいますか?

ありがとう!

編集:これまでのところ唯一の答えに基づいているようですが、おそらくポリモーフィックな関連付けがこれを進める方法ですが、答えは非常に簡単なので、この方法でどのように使用できるかわかりません-誰でも詳しく説明できますか?

編集 2: OK、私はどこかに到達していると思います - 基本的に、私は現在 has_many オペランドを持つメトリックと、オペランド has_many メトリックを持っています。メトリクスが多くのメトリクスを持つことができるポリモーフィックな自己結合が必要です - メトリクス モデルがそれ自体を使用できるように、これを別の何か、おそらくcalculated_metricsと呼ぶ必要がありますか? これにより、メトリクスには多くのオペランドがあり、メトリクスには多くの計算されたメトリクスがあるという状況が残ります。

編集 3: 以下のようにモデルを更新しました。これが問題にアプローチする良い方法であるかどうかについての批評をいただければ幸いです。基本的に他のメトリックのホルダーであるというモデルを追加したことに注意してください。calculated_metricつまり、メトリックは 2 つのオペランド、またはオペランドと Calculated_Metric の組み合わせを使用して計算できます。

改訂モデル

EDIT 4: これを行うための詳細な Rails-y の方法を私に示すことができる人には、賞金が追加されました。

編集 5: 報奨金はまだ獲得可能です。以下に提供される回答は詳細ですが、問題にアプローチする別の方法ではなく、これを行うための最良の方法を探しています(つまり、問題を回避する方法を探すのではなく、問題に取り組む最善の方法を教えてください。この機能が必要なので)。ありがとう!

編集 6: これについてはあまり注目されていません - 報奨金の増加は助けになりますか、それともこの質問は単なるランナーではありませんか?

4

2 に答える 2

1

一歩下がって、式を分解し、リレーショナル データベースに 1 つずつ格納する必要があるかどうかを自問することを検討してください。

  • それはあなたの目的にとって本当に意味がありますか?
  • 他のアプリケーションは、式のフラグメントを保持する基礎となるテーブルにクエリを実行しますか?
  • 各オペレーターの使用頻度を示すレポートを生成しますか?
  • それとも、リレーショナル データベースが最も使い慣れているという理由だけで、式を格納するために使用していますか?

RDBMS は、この仕事に適したツールではないようです。

式を文字列として保存し、ファイルまたはデータベースから文字列をロードするときに式ツリーに解析できます。式パーサーの書き方を示す例はたくさんあります。

つまり、Ruby と Rails の用語で言えば。私は次のことをします:

  1. 式ツリーを構成するほとんどのクラスを、ActiveRecord を拡張しない単純な古い Ruby クラスにします。
  2. これらのクラスのそれぞれに to_s を実装して、to_s を式ツリーのルートに送信すると、適切な形式の式の文字列表現が返されるようにします。
  3. 文字列から式ツリーを作成できる ExpressionParser または ExpressionBuilder または ExpressionFactory (任意の用語を使用) を実装します。
  4. 次に、一部の ActiveRecord モデルが排他的に「所有」するメトリックを指していた場合、メモリ内の式ツリーを指すようにすることができますが、それ自体を保存するときに (to_s を介して) 文字列表現を格納することができます。
  5. 古い設計で複数の ActiveRecord モデルが同じ (共有) 式を指している場合は、その永続的な表現に文字列を使用する SharedExpressions のクラスを作成し、新しい SharedExpression を指すように The AciveRecords を変更する必要があります。

このルートに進む場合は、before_save などの ActiveRecord コールバックが役立つ場合があります。幸運を。

于 2012-07-11T01:55:44.890 に答える
0

私があなたの質問を正しく理解していれば、あなたはポリモーフィックな関連を探していると思います。

例:

class Metric < ActiveRecord::Base
   belongs_to :calculable, :polymorphic => true
   has_many :operations, :as => calculable
end

class Operand < ActiveRecord::Base
   belongs_to :calculable, :polymorphic => true
end
于 2012-07-04T20:04:28.100 に答える