2011-01-30 7 views
2

製品コンフィグレータを作成中です。問題は、各製品に多くのコンポーネントがあり、それ自体が設定可能であることです。購入時にコンピュータを設定しているとします。 コンポーネントが選択されたとき、またはコンポーネントの数量があるとき、または両方の組み合わせであっても、依存関係が適用されることがあります。ある時点ではすべてが非常に複雑になり、ある意味ではそれぞれが独自の宇宙であるため、製品間で一貫性がありません。テキストをコードに変換する

ああ、これらのルールは常に変わるので、アプリでコーディングすることは本当に私の選択肢ではありません。

私は、データベースにvalidateというメソッドのコードを格納できることを期待していました。 各設定には独自のバージョンのvalidateがあります。これはdbにテキストとして保存され、必要に応じて変更できます。

これは可能ですか?私はどのようにテキストを取って、このテキストが何を言ってもレールを実際に実行させることができますか?

たとえば、私はこれを持っている:

irb(main):246:0> @h= Configuration.find(1).rule 
=> "def getmax3(inputarray)\n @maxpos = 0\n inputarray.each do |h|\n  if @maxpos < h.position\n  @maxpos = h.position\n  end\n end\n 1\n end" 

をobvioslyコードされていません。上記の方法は、私が物事を理解しようとしているので、もちろん単なるテストです。

(ああ、私はこれを行うには恐ろしいの練習でなければなりませんが、私は本当に別の方法を考えることはできません知っている)

どうもありがとう!

答えて

1

はい、それは恐ろしい習慣です:)

あなたはシンプルを持っていたし、実装するためのルールを安定化している場合は、専用のテーブルにいくつかの変数を格納し、あなたのルールでこれらの変数を使用することができます。これらのルールについて何が起こるかを実際には分からないように見えるので、テスト済みで実績のあるワークフローを使用してチャレンジを受け入れる準備ができています。ここで

は私の提案です: をコミットして展開し、専用の検証ライブラリに

  • コード&テストルールを自分のルールを書くカピストラーノおよびその他のツール
  • を使用して

    • セットアップ自動デプロイ手順

      DSLを定義することで、長期的にこのようなルールを操作することにコミットし、唯一のものではないそのような仕事を担当する。適切な時間にルールがどのように変更されるかを観察し、専用DSLを持つことが良いことか時間の無駄であるかを知ることができます。

  • +0

    ご回答ありがとうございます。私はRoRの初心者ですから、この提案は現実から遠くにあるようです。 この設定ライブラリはどこに保存しますか?これは私がファイルにアプリに入れたものですか? Libフォルダにありますか? – Lievcin

    +0

    できるだけ簡単に開始してください。これらのルールの検証ルールですか?それらをあなたのモデルに入れてください。アプリケーションのワークフローに関連するものは何ですか?コントローラを自宅にします。あなたは後で自分で決定します。 – lbz

    1

    私はあなたの問題を誤解しているかもしれませんが、データベースから、そしてテストとバージョン管理が可能なファイルにコードを渡すことができれば、はるかに幸せな場所にいます。あなたのモデルの複雑さを知らずに、最良のアプローチが何であるかを言うのは難しいですが、私はそこにいることを保証します。

    一般的なプロパティと動作を共有する関連コンポーネントを持つ複雑なシステムをモデル化するために、過去に単一テーブル継承を使用しました。このアプローチをアプリケーションで使用することができます。 STIは、基本的には、あなたのケースのConfigurationクラスとサブクラスのすべてが同じテーブルにある親クラスを持っていると言います。サブクラスのすべてではなく一部で共通の動作がある場合は、そのコードをモジュールに移動し、それを必要とするクラスに含めることができます。

    基本親クラスだけではActiveRecordを継承します:

    class Configuration < ActiveRecord::Base 
    end 
    

    次に、各サブクラスが、その中に定義されたそのロジックだろう:私は、これはあなたが望む方向であるとは言わないよ

    class Component < Configuration 
        def getmax3(inputarray) 
        @maxpos = 0 
        inputarray.each do |h| 
         if @maxpos < h.position 
         @maxpos = h.position 
         end 
        end 
        1 
        end 
    end 
    

    を行きたいですが、うまくいけば、あなたのシステムをモデル化する他の方法について考えさせるでしょう。

    関連する問題