2011-09-23 56 views
1

我最近开始搞乱一个名为'ruleby'的gem,Ruby是一个规则引擎。然而,ruleby的文档有点稀疏,我似乎无法弄清楚如何正确引用规则写入位的关联。我无论是规则的“模式”部分还是规则的执行块部分。引用与Ruleby on Rails的关联

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

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

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

如果任何人都可以指出我正确的方向,我会非常感激。谢谢。

回答

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 

,它只会添加到它,直到你删除引擎或重建它。

的规则手册就是你把你的事实,对我来说,我做到了编程:

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 

我也做了一个case语句,因为我是加载规则编程。我还要检查说这个规则之前运行过,因为每次运行引擎时它都会评估所有事实,即使是已经匹配的事实。

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

+0

谢谢!我在一段时间里并没有真正迷上通过宝石的规则,但这篇文章肯定会让我重新考虑这个决定。 – hankang