7

ここで車輪を再発明しようとしているような気がするので、その前に...

処理する必要がある大量のデータ セットがあり、データを処理する「ルール」は時間の経過とともに進化するため、単純なルール エンジンを実装することが適切であると考えました。

自然言語パーサーを探しているわけではないことに注意してください。すべてのルールを ruby​​ proc にしたいのです。

構文は次のようになると想像できます。

engine = SimpleRulesEngine.new

rule = engine.add_rule(priority: 10) do |row|
  row.name != 'George'
end

rule.action do |row|
  puts "Yikes, name is not George!, it was #{row.name}"
  row.update_attribute :name, 'George'
end

engine.process collection

これに役立つ既存のパターンや宝石がそこにあるかどうか疑問に思っていました. 最も近いと思われるものはrulebyですが、積極的に維持されているようには見えず、私の問題の解決策が複雑すぎるようです。

ありがとう!


これは : Ruby & Rules Enginesと同様の質問であることに注意してください。

4

5 に答える 5

7

@DaveNewtonは私にいくつかの意味を話しました.基本的に私が自分のアプリ用の単純なDSLを探していたことは明らかです.これは私が最終的に使用したものです.

# /lib/simple_rules_engine
# To use, just include it in any file where you need some rules engine love ...
# then defile rules like so:
#
# rule :name_of_rule,
#       priority: 10,
#       validate: lambda {|o| # do something with o}
#       fail: lambda {|o| o.fail!}} 
# 
# then to run the engine
# process_rules(your_data_set)
#   
module SimpleRulesEngine
  extend ActiveSupport::Concern

  included do
    class_attribute :rules
    self.rules = []
  end

  module ClassMethods

    # rule :name_of_rule,
    #       priority: 10,
    #       validate: lambda {|o| # do something with o}
    #       fail: lambda {|o| o.fail!}}
    def rule(name,options={})
      self.rules << SimpleRulesEngine::Rule.new(name,options)
    end

    def process_rules(collection)
      collection.each do |row|
        rules.sort_by(&:priority).each do |rule|
          rule.run(row)
        end
        row.valid!
      end
    end

  end

  ## Helper Classes

  class Rule

    attr_accessor :priority
    attr_accessor :name

    # proc to test
    attr_accessor :validate

    # if valid
    attr_accessor :success


    # if invalid
    attr_accessor :fail

    NO_OP = lambda {|o| true }

    def initialize(name, options={})
      self.name = name
      self.priority = options[:priority] || 10
      self.validate = options[:validate] || NO_OP
      self.fail = options[:fail] || NO_OP
      self.success = options[:success] || NO_OP
    end

    def run(data)

      if validate.call(data)
        success.call(data)
      else
        fail.call(data)
      end

    end
  end

end
于 2012-08-29T15:41:18.253 に答える
1

他の既存のRubyルールエンジンと比較すると、Rulebyは最も積極的に保守されているようです。

ただし、Wongi Engineは有望に見え、必要なものになる可能性があります。

于 2012-08-28T18:46:08.780 に答える
1

Stratus3D が提案したように、おそらく Wongi を見てください。一見すると見栄えが良く、イントロも良い。今後数週間、より複雑なテストケースでテストします。

一方、Rools はメンテナンスされていないようです (rubyforge ページは停止しており、私が見つけたすべてのフォークも同様に停止しているようです)。

于 2015-02-06T08:31:27.430 に答える
0

私は数週間 Ruleby をオン/オフして遊んでいましたが、使用するのはそれほど複雑ではありませんが、複雑さを追加したのは、大規模な case ステートメントを使用してプログラムでルールをエンジンにロードすることです。

事実のようなものがエンジンに永続的であり、その後の各実行は、入力した事実だけでなく、以前に主張した事実も評価することを理解すると、非常に簡単です。一部がブラックボックス化されているのは好きではありませんが、実行時エラーが発生した場合は、トラブルシューティングが絶対に面倒です (現在、一部を使用しているため)。

于 2012-09-26T22:03:43.707 に答える