首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ruby规则引擎

ruby规则引擎
EN

Stack Overflow用户
提问于 2012-08-28 15:11:06
回答 5查看 7.2K关注 0票数 7

我觉得我要重新发明方向盘了,所以在我这么做之前.

我有大量需要处理的数据,处理数据的“规则”将随着时间的推移而发展,所以我认为实现一个简单的规则引擎是合适的。

注意,我不是在寻找一个自然语言解析器,我希望所有的规则都是ruby。

我可以想象这样的语法:

代码语言:javascript
复制
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

我想知道是否有任何现有的模式或宝石,可以帮助这一点。看起来最接近的是卢莱比,但它似乎没有得到积极的维护,而且对于我的问题,解决方案似乎太复杂了。

谢谢!

注意,这是一个类似于:Ruby & Rules引擎的问题,但与此不同的是,我并不关心自然语言处理和规则存储。

EN

回答 5

Stack Overflow用户

发布于 2012-08-29 15:41:18

@DaveNewton向我倾诉了一些观点,很明显,我基本上是在为我的应用程序寻找一些简单的DSL,这是我最后使用的--非常简单,但如果它对其他人有用的话:

代码语言:javascript
复制
# /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
票数 7
EN

Stack Overflow用户

发布于 2012-08-28 18:46:08

与其他现有的Ruby规则引擎相比,Ruleby似乎是维护得最积极的:

  • 罗尔斯
  • Ruby规则

然而,Wongi发动机看起来很有希望,并且可能成为您所需要的。

票数 1
EN

Stack Overflow用户

发布于 2015-02-06 08:31:27

也许可以看看Wongi,就像Stratus3D建议的那样。从第一眼看,它看起来不错,并有一个很好的介绍。接下来的几周,我将在一个更复杂的测试案例中测试它。

另一方面,Rools似乎没有得到维护(rubyforge已经死了,我发现的所有叉子似乎也都死了)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12162305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档