引用与Ruby on Rails的关联

时间:2011-09-23 02:41:39

标签: ruby-on-rails-3 rule-engine

我最近开始搞乱一个名为'ruleby'的宝石,这是Ruby的规则引擎。但是,ruleby的文档有点稀疏,我似乎无法弄清楚如何正确引用规则写入位的关联。我既困扰了规则的“模式”部分,也困扰了规则的执行块部分。

例如,假设我有一条规则只会在用户提交正面评论时执行。例如,我可以写下以下内容:

    rule :positive_review, [Review, :review, method.review_rating == "positive"] do |v|
        assert (store positive_review somehow)
    end

所以在这一点上我迷路了。我想编写一条规则,该规则将引用回用户,并检查该正面评论的用户的正面评论总数,并可能根据此编号执行某些操作。

如果有人能指出我正确的方向,我将非常感激。感谢。

1 个答案:

答案 0 :(得分:1)

我不太明白为什么你在规则内部断言,这应该已经完成​​了。 github示例代码现在可能已经回答了你,但是如果不是:

首先你初始化引擎,我这样做了所以我可以多次调用它。

rule_engine = Ruleby::Core::Engine.new
RULES_ENG = RulesEngineCaller.new(rule_engine)
EngineRulebook.new(rule_engine).rules

然后你断言你的事实

@events = Event.all
@events.each do |event|
    @rule_engine.assert event
end

然后你运行你的引擎

@rule_engine.match

如果你想通过将assert per fact调用到现有引擎来添加事件,它只会添加到它,直到您在引擎内部删除或重建它。

规则手册是您为我添加事实的地方我以编程方式执行:

class EngineRulebook < Rulebook
  def rules
    Rails.logger.debug "#{Time.now.utc} - Loading Rules into Rulebook"
    #msg = Notification.new()
    @rules = Rule.all

    @rules.each do |rule_name|
    case
     #hard coded rule - for auto cleaning
     when (rule_name.title == "SYSTEM ADMIN - auto-clean delete rule") && (rule_name.group.title == "Notification Admin")
      rule [Event, :m, m.terminate_flag == 1] do |v|
        if v[:m].rules.include?(rule_name) == false
          #output matched rule to console & logfile
          Rails.logger.info "#{Time.now.utc} - match rule #{rule_name.id} #{rule_name.title} - #{v[:m].ticket_id} - #{v[:m].description}"

          #add reference so rule doesn't fire again
          @event = Event.find_by_id(v[:m].id)
          @event.rules << rule_name
          v[:m].rules << rule_name
          modify v[:m]
          #Retract v[:m] would remove the fact from the rules engine, need to remove all related facts though
          #so dont use this as other rules may be requires as rules do not fire in order
        end
      end
   end

由于我是以编程方式加载规则,因此我也将其作为案例陈述。我还检查了之前是否运行过此规则,因为每次运行引擎时,它都会评估所有事实,甚至是那些已经匹配的事实。

希望你有一个答案,如果没有希望这会有所帮助。