我有以下情况-
我有Company和Incident。
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模型来代替这些字符串?在Rails应用程序的上下文中,是否有将事实加载到引擎中的最佳实践?
我的用法是,用户选择一个事件,并要求公司,可以服务的事件。我需要向规则引擎询问一份可以完成此任务的公司列表:)
发布于 2015-05-29 17:06:14
您可以对引擎进行嵌套迭代。
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具有属性name,Incident有属性name,Service具有属性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]
endhttps://stackoverflow.com/questions/30528438
复制相似问题