我最近开始搞乱一个名为'ruleby'的宝石,这是Ruby的规则引擎。但是,ruleby的文档有点稀疏,我似乎无法弄清楚如何正确引用规则写入位的关联。我既困扰了规则的“模式”部分,也困扰了规则的执行块部分。
例如,假设我有一条规则只会在用户提交正面评论时执行。例如,我可以写下以下内容:
rule :positive_review, [Review, :review, method.review_rating == "positive"] do |v|
assert (store positive_review somehow)
end
所以在这一点上我迷路了。我想编写一条规则,该规则将引用回用户,并检查该正面评论的用户的正面评论总数,并可能根据此编号执行某些操作。
如果有人能指出我正确的方向,我将非常感激。感谢。
答案 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
由于我是以编程方式加载规则,因此我也将其作为案例陈述。我还检查了之前是否运行过此规则,因为每次运行引擎时,它都会评估所有事实,甚至是那些已经匹配的事实。
希望你有一个答案,如果没有希望这会有所帮助。