2014-05-21 45 views
0

我在使用最有效的數據模型來存儲邏輯標準時遇到了一些麻煩。該標準可以如下:用於表達邏輯標準的數據模型設計

  • 字段=值
  • 字段=值
  • 字段1 =值1和Field2 =值2
  • 字段1 =值1或場=值2

但也可以嵌套爲:

  • (Field1 = Value1或Field2 = Value2)A ND Field3 = Value3

嵌套可以是無限深的。

我開始用這樣的模式:

Criterion 
    Field Name 
    Comparison Operator 
    Comparison Value 

這讓我表達簡單的標準,如「字段=值」。

我應該如何使用AND/OR語句將Criterion鏈接在一起,以及處理嵌套的最佳方法是什麼?

FYI(可能加入更多內容) - 這是一個Rails/Mongoid項目。我有一個Document其中embeds_many :criteria。我需要能夠調用Document.criteria_string,並有文件迭代所有的標準和assemple它變成一個語句佔嵌套,鏈接和的標準定位。

謝謝!

回答

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" 
+0

真棒。我使用了Mongoid'recursively_embeds_many',並能夠完成它類似於上面的內容。謝謝! – user1032752