根据表格响应过滤用户访问权限

时间:2013-09-10 16:00:13

标签: oop database-design language-agnostic filtering

我正在构建一个“调查”类型的应用程序。用户使用经过预先审查的答案回答一组问题。

Question: Where do you live?
Answers: England, Finland, Spain, France, Monrovia

这种情况下的答案将在DropDownList中。

一旦用户完成了基本的回复(地点,年龄,性别等),我希望能够阻止他们根据他们的答案访问其余的调查。

因此,例如,如果他们住在除英格兰以外的任何地方,我想将他们引导到一个页面上写着“谢谢,但蒙罗文不能完成这项调查”。我需要我的过滤是用户可配置的(基于表格),我需要能够有AND和OR 因此,用户必须获得10万+一年的过滤器。 另一个原因是他们要么生活在西班牙,要么是女性和模型火车 - “100k +&&(西班牙||(女性和&火车))”

我通常会使用Enums和bitmasking,但由于我的国家/地区列表长度超过200个项目,我无法想出存储过滤的合理方法。

希望我已经有所了解并且有人有一个不错的解决方案:)

1 个答案:

答案 0 :(得分:1)

我不知道我是否可以完全回答你的问题,但我会尝试......

所以,如果她之前选择了一些答案,我们会看到一堆只有用户才能看到的视图,例如,如果她年龄大于30岁,她会看到#3,如果她小于30,则会看到#4来自中国,并且如果她年龄超过40岁并且来自西班牙或意大利,那么会看到#5等等......我还要介绍**步**的概念,并且每一步我们都可以拥有1,2或更多相应的观点。每个视图都应该有一组规则(如上所述),用于定义是否显示它们。

如何创建这些规则?这些规则可以是Filter类/接口的简单实例,当被问到时,应该返回true / false。像这样:

interface Filter {
     boolean apply();
}

然后你可以创建像'年龄超过30','来自西班牙'的过滤器,无论如何。请记住,每个视图都配置了一组规则(过滤器),因此如果询问它是否可以显示,它可以回答是/否。

接下来,如何应用这些过滤器? 我们可以有一个只知道步骤的控制器对象(每个步骤可以有一个或多个相应的视图,正如我所说),并且在用户按下下一步之后当前步骤,它应该收集答案并将其应用于每个视图附带的规则。比如,从第一步中获取答案,并将它们应用于第二步中的所有视图,并查看哪一个匹配(返回true)。例如,在第二步,您可以有两个单独的视图,一个用于年轻人,另一个用于老人,并且您应用每个视图中的规则来决定是否显示旧视图或年轻视图。 我可以给你一个代码示例,你也可以自己做研究,因为我对你的技术环境一无所知。我已经在类似的问题上使用了Google Guava的谓词,这里是:假设我们正在处理Witch对象,并且每个对象都有名称(字符串),年龄(int)和法术(集合)属性。如果我有一个巫婆列表,我需要根据具体标准对它们进行排序,我可以这样做:

// first I want to sort witches by age(natural ordering) then by spells, and then by name lexicographically
    Ordering.natural().compound(new BySpellsWitchOrdering())
            .compound(new ByNameWitchOrdering()).sortedCopy(witchList);

上面的代码行将采用女巫列表并根据标准返回已排序的女巫列表。你的情况非常相似。

接下来,如何创建答案?对于每个视图(页面),您都有可能的答案,例如,对于视图#1,您可以拥有:年龄,性别,种族,国家/地区。您可以以字符串,整数,枚举的形式构造一些答案,并将它们传递给控制器​​,控制器又将它们应用于与下一步相对应的每个视图。

至于如何将规则存储在数据库中,作为一个例子,你可以有一个列定义规则名称(比如,OLDER THAN)和一列值,比如30。再一次,我对你的环境知之甚少,这是一个非常普遍的问题,所以我会在这里停下来......