2015-05-29 158 views
2

我有以下的情況 -使用規則引擎

我有Company,我有Incident

A Company提供許多服務(Service),因此 - has_and_belongs_to_many :services

Incident需要一些服務(Service),因此 - has_and_belongs_to_many :services

現在對於一個給定的事件,我需要找到所有提供我所需要的服務公司。我期望使用規則引擎來做到這一點,因爲我有更復雜的條件來適用於選擇合適的公司。

我看着這個名爲 - Wongi-engine(github.com/ulfurinn/wongi-engine)的寶石,但它太難纏我的頭,寫規則。

你能爲我提供任何指針嗎?謝謝!

我能想出以下facts

engine << [ "CompanyA", "offers", "serviceA" ] 
engine << [ "CompanyB", "offers", "serviceB" ] 
engine << [ "CompanyA", "offers", "serviceB" ] 
engine << [ "CompanyB", "offers", "serviceC" ] 
engine << [ "IncidentA", "requires", "serviceC" ] 
engine << [ "IncidentA", "requires", "serviceA" ] 

編輯: 也曾經我寫這些規則,我怎麼使用Rails的模型來代替這些字符串的?在Ruby on Rails應用程序的上下文中是否有將事實載入引擎的最佳實踐?

我的用例是,用戶選擇一個事件並要求可以爲事件提供服務的公司。我需要問規則引擎的公司名單,可以做的伎倆:)

回答

2

你可以做到與嵌套迭代引擎。

engine.each "IncidentA", "requires" :_ do |requires| 
    engine.each :_, "offers", requires.object do |offers| 
    puts "IncidentA can get #{requires.object} from #{offers.subject}" 
    end 
end 

要做到這一點作爲一個原則...

suppliers = engine.rule "service suppliers" do 
    forall { 
     has :Company, "offers", :Service 
     has :Incident, "requires", :Service 
    } 
end 

然後使用規則,選擇事件的類型和重複的信息。

suppliers.tokens.select{|s| s[:Incident] == "IncidentA" }.each do |s| 
    puts "#{s[:Incident} can get #{s[:Service]} from #{s[:Company]}" 
end 

要做到這一點作爲一個查詢...

q = engine.query "companies" do 
    search_on :Incident 
    forall { 
     has :Company, "offers", :Service 
     has :Incident, "requires", :Service 
    } 
end 

engine.execute "companies", { Incident: "IncidentA" } 
q.tokens.each do |s| 
    puts "#{s[:Incident} can get #{s[:Service]} from #{s[:Company]}" 
end 

編輯增加了對你的問題的筆記有關填充facts ...

假設你有Company與屬性nameIncident與具有屬性nameService的屬性name

Company.joins(:services).select("companies.*, services.name as service_name").each do |company| 
    engine << [company.name, "offers", company.service_name] 
end 

Incident.joins(:services).select("incidents.*, services.name as service_name").each do |incident| 
    engine << [incident.name, "requires", incident.service_name] 
end 
+0

太棒了。謝謝你。所有這些使得現在更加合理。我會盡力將其納入我的應用程序。 –

+0

還有一件事,我該如何將我的Rails應用程序與我的服務,事件和公司模型進行整合?有沒有什麼好的做法將事實加載到引擎中?謝謝!!編輯此部分的問題:) –

+0

好的,我修改了這個問題,以顯示如何使用一些ActiveModel內部連接填充事實。 – SteveTurczyn