我在提供用于存储逻辑标准的最有效数据模型时遇到了一些麻烦。标准如下:
但也可以嵌套为:
嵌套可以无限深。
我开始使用这样的模型:
Criterion
Field Name
Comparison Operator
Comparison Value
这允许我表达简单的标准,例如' Field = Value'。
我应该如何使用AND / OR语句将Criterion
链接在一起?处理嵌套的最佳方法是什么?
FYI(可能会添加更多上下文) - 这适用于Rails / Mongoid项目。我有Document
embeds_many :criteria
。我需要能够调用Document.criteria_string
并让文档迭代所有条件并将其汇总到一个语句中,以解释标准的嵌套,链接和定位。
谢谢!
答案 0 :(得分:2)
我想我明白你要做的是什么,最好的方法是将你的逻辑标准看作一棵树,每个标准可以是叶子(并且有一个名称,运算符和值)或者它可以参考另一个标准。 criteria_string应该足够智能,以处理您需要的不同类型的Criteria。 - 树的叶子是键或值(定义字符串键) - 树的一个分支是标准本身
标准可以这样建模
class Criteria
include Mongoid::Document
field :string, type: String
field :operator, type: String
embeds_one :name, class_name: 'Criteria'
embeds_one :value, class_name: 'Criteria'
def criteria_string
string || "#{name.criteria_string} #{operator} #{value.criteria_string}"
end
end
关键是让名称和值都是另一个嵌入标准,并且只有在Criteria
表示实际名称或值字符串时才定义字符串
Criteria.new(
name: Criteria.new(string: 'city'),
operator: '!=',
value: Criteria.new(string: 'San Francisco')
).criteria_string
#=> "city != San Francisco"