2011-09-23 59 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