用于使用布尔逻辑创建自定义过滤器的Web表单

时间:2014-04-01 02:03:39

标签: ruby-on-rails boolean-logic

我有一个Rails应用程序,我希望用户能够从类别列表中创建自定义布尔组合,这些组合本身是动态加载的。例如,如果我有类别foo barbaz,我希望用户能够选择(foo AND bar) OR bazfoo OR baz或任何其他逻辑这些类别的组合。我预期的最常见的用例类似于(a OR b OR c) AND (d OR e OR f) AND (g OR h);也就是说,是几个分离的结合。

然后将结果存储在某些数据结构中,以后可以将其用作过滤器。理想情况下,这将通过图形界面完成,而不是让用户在文本中构造布尔逻辑。

在我尝试自己实现之前,是否有一个我可以提供的库已经实现了这个或类似的东西?或者开源的东西可以让我在那里的一部分,我可以分叉和修改?

1 个答案:

答案 0 :(得分:1)

您可以通过四种方式实现布尔检索来选择给定类别:

  1. 未选中
  2. 正面选择( + 前缀;类别为必填项)
  3. 否定选中(Google搜索中 - 前缀;不得出现类别)
  4. 已选择(无前缀)
  5. 不在ruby-on-rails但可能很容易从c#翻译:

        public bool IsMatch(string s)
        {
            s = s.ToLower();
    
            bool ret = ((negWords.Count == 0) || !hasMatchInSet(s, negWords, true))
               && ((posWords.Count == 0) || hasMatchInSet(s, posWords, false))
               && ((words.Count == 0) || hasMatchInSet(s, words, true));
    
            return ret;
        }
    
       private bool hasMatchInSet(string s, HashSet<string> setOfWords, bool breakOnFirstMatch)
        {
            int matches = 0;
            bool ret = false;
    
            foreach (string w in setOfWords)
            {
                if (s.IndexOf(w, StringComparison.InvariantCultureIgnoreCase) >= 0)
                {
                    matches++;
    
                    if (breakOnFirstMatch)
                    {
                        break;
                    }
                }
            }
    
            ret = (breakOnFirstMatch && (matches > 0)) || (matches == setOfWords.Count);
    
            return ret;
        }