数据模型设计表达逻辑标准

时间:2014-05-21 17:13:13

标签: ruby-on-rails database-design mongoid data-modeling

我在提供用于存储逻辑标准的最有效数据模型时遇到了一些麻烦。标准如下:

  • 字段=值
  • Field!= Value
  • Field1 = Value1 AND Field2 = Value2
  • Field1 = Value1 OR Field2 = Value2

但也可以嵌套为:

  • (Field1 = Value1 OR Field2 = Value2)AND Field3 = Value3

嵌套可以无限深。

我开始使用这样的模型:

Criterion
  Field Name
  Comparison Operator
  Comparison Value

这允许我表达简单的标准,例如' Field = Value'。

我应该如何使用AND / OR语句将Criterion链接在一起?处理嵌套的最佳方法是什么?

FYI(可能会添加更多上下文) - 这适用于Rails / Mongoid项目。我有Document embeds_many :criteria。我需要能够调用Document.criteria_string并让文档迭代所有条件并将其汇总到一个语句中,以解释标准的嵌套,链接和定位。

谢谢!

1 个答案:

答案 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"