2

私は最近これについていくつか質問をしました、そして私は私が行く必要があるところに到達しています、しかしおそらく私の最後の質問でそこまで到達するのに十分具体的ではありませんでした。そのため、アプリデータに基づいていくつかの指標を計算するための構造をまとめようとしています。これは、追加の指標を簡単に(そして安全に)追加できるように柔軟であり、ビューでの使用も比較的簡単である必要があります。

全体的な目標は、私の見解で次のようなものを可能にするカスタムヘルパーを使用できるようにすることです。

calculate_metric(@metrics.where(:name => 'profit'),@customer,@start_date,@end_date)

これはかなり自明である必要があります。名前は、使用可能なメトリック名のいずれかに置き換えることができ、計算は、任意の期間、任意の顧客または顧客のグループに対して実行できます。

複雑さが生じるのは、メトリックを計算するための式を格納する方法です。これを行うためにまとめた現在の構造を以下に示します。

ここに画像の説明を入力してください

主要なモデルは、メトリック、操作、操作タイプ、およびオペランドであることに注意してください。この種の構造は、数式が利益のように非常に単純な場合に問題なく機能します。1つには2つのオペランドしかなく@customer.sales.selling_price.sum@customer.sales.cost_price.sum1つの型減算の演算があります。中間値を格納する必要がないため、は、になりregister_targetます。1return_register

どこがより複雑になるかを示すために完全な例を書く必要はないと思いますが、2つの日付の間にアカウントを開設した顧客の電子メールアドレスを持つ顧客の割合を計算したい場合は、言うだけで十分です(必ずしもそうではありませんでした)購入)、ヘルパー関数は日付の変動を処理する方法を知る必要があるため、これははるかに複雑になります。

そのため、この構造は非常に複雑であり、単純な式以外には使用するのが難しいようです。この問題に取り組むためのより良い方法を誰かが提案できますか?

EDIT: On the basis of the answer from Railsdog, I have made some slight changes to my model, and re-uploaded the diagram for clarity. Essentially, I have ensured that the reporting_category model can be used to hide intermediate operands from users, and that operands that may be used in user calculations can be presented in a categorised format. All I need now is for someone to assist me in modifying my structure to allow an operation to use either an actual operand or the result of a previous operation in a rails-esqe way.

Thanks for all of your help so far!

4

1 に答える 1

3

Oy vey. It's been years (like 15) since I did something similar to what it seems like you are attempting. My app was used to model particulate deposition rates for industrial incinerators.

In the end, all the computations boiled down to two operands and an operator (order of operations, parentheticals, etc). Operands were either constants, db values, or the result of another computation (a pointer to another computation). Any Operand (through model methods) could evaluate itself, whether that value was intrinsic, or required a child computation to evaluate itself first.

The interface wasn't particularly elegant (that's the real challenge I think), but the users were scientists, and they understood the computation decomposition.

あなたの問題について考えると、私はその値を返すことができる個々のメトリックを持っていて、その答えに到達するために必要なメソッドを作成します。結局のところ、単一のメトリックは、指定された演算子を使用して2つのオペランドを組み合わせる方法を知っている必要があります。オペランド自体がメトリックである場合は、その値を尋ねるだけです。

于 2012-07-03T12:55:28.930 に答える