2016-12-26 168 views
0

我想允许用户定义简单业务逻辑,如:如何将业务逻辑存储到数据库中?

if (x and y) then ... 
if (z or w) then ... 

让我把它具体:

我开发,如果申请人满足一定的要求,回答一个HR模块,由用户定义。

这些要求可以围绕逻辑运算符来定义:

(必须是18岁)(18岁必须有家长许可)

是把这个数据库里面的逻辑好吗?我认为是这样,但我害怕花时间在这件事上,并发现它是一种糟糕的做法。

回答

1

经常这样,答案是“它依赖于”;)由于在这种情况下,逻辑似乎是用户定义的数据,因此将其放入数据库是绝对合理的。

但是,如果你正在寻找此输入的结构/ AST与他们andor控制流模型为单独的业务对象反映数据库中的记录,我不得不说,这很可能矫枉过正和意志 - 除了最初的实现开销 - 使未来的重构非常困难。

将在运行时评估的简单文本字段是最简单的方法,因为其内容可以很容易地提取和推理。

不知道你的权威要求,我建议你看看Drools,一个Java的规则引擎,它的生态系统中还有一个规则存储后端和指导编辑器。顺便提一下,你的问题中的例子看起来很像它可能受益于规则引擎,但不幸的是,我没有任何相关Ruby库的实际经验。

否则这篇关于thougtbot博客的文章 - Writing a Domain Specific Language in Ruby - 也可能对此有帮助。

0

我绝对认为没关系。由于用户正在定义业务逻辑或规则,因此我建议将业务逻辑表单字段拆分为多个部分(规则:if/unless,操作数1:user.age,操作数2:权限。父级操作员1:和操作员2:更高级_ .. ),然后将每个业务逻辑对象作为行存储在序列化的JSON列中。与用户输入任何他们喜欢的单个文本字段相比,这应该使他们更容易验证并且更不容易出错。

0

我会建议创建一个简单的表来存储逻辑,如果它是可预测的。

例如:

Table: business_logics 
Attributes: 
opt_1: decimal 
opt_2: decimal 
logic_opt: integer (enum: and|or) 
then_statement: string 

所以这是可扩展的,当你有一天在更logic_opt,顺便说一句,你可以得到的好处的验证&重构以后!允许用户输入自由文本在您的案例中风险很大!

0

没关系。这是一种灵活的方法,虽然在开发过程中很耗时。此外,您不必创建自己的DSL,它已经完成,例如, json-logic-ruby允许在json中保留复杂的规则。