首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用规则引擎

使用规则引擎
EN

Stack Overflow用户
提问于 2015-05-29 11:28:22
回答 1查看 916关注 0票数 2

我有以下情况-

我有CompanyIncident

Company提供许多服务(Service),因此- has_and_belongs_to_many :services

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

现在,对于一个特定的事件,我需要找到所有提供我需要的服务的公司。我希望使用规则引擎来实现这一点,因为我有更复杂的条件可适用于挑选合适的公司。

我查看了这个名为- Wongi-engine的宝石(github.com/ulfurinn/wongi-engine),但它太难让我的头脑围绕它并编写规则。

你能给我提供一些指点吗?谢谢!

我可以想出下面的facts

代码语言:javascript
复制
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应用程序的上下文中,是否有将事实加载到引擎中的最佳实践?

我的用法是,用户选择一个事件,并要求公司,可以服务的事件。我需要向规则引擎询问一份可以完成此任务的公司列表:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-29 17:06:14

您可以对引擎进行嵌套迭代。

代码语言:javascript
复制
engine.each "IncidentA", "requires" :_  do |requires|
  engine.each :_, "offers", requires.object do |offers|
    puts "IncidentA can get #{requires.object} from #{offers.subject}"
  end
end

作为一个规则..。

代码语言:javascript
复制
suppliers = engine.rule "service suppliers" do
    forall {
        has :Company, "offers", :Service
        has :Incident, "requires", :Service
    }
end

然后使用规则,选择事件类型,并迭代获取信息。

代码语言:javascript
复制
suppliers.tokens.select{|s| s[:Incident] == "IncidentA" }.each do |s|
  puts "#{s[:Incident} can get #{s[:Service]} from #{s[:Company]}"
end

作为查询..。

代码语言:javascript
复制
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

代码语言:javascript
复制
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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30528438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档