我有一组Time
个对象。我希望我的用户能够根据各种标准选择元素的子集。标准的数量是未知的,它可以变化。另外,如果需要,我想在将来添加其他标准。
如果ts
是数组,我可以写:
ts.select{|t| (t.hour == 12 || t.hour == 16) && t.month == 3}
但我如何才能使这个通用,以便Time
的每个方法都可以用于过滤?例如,UI可以生成Hash
:
{:hour => [12, 16], :month => [3]}
这应该用于创建结合所有条件的最终过滤器。
对于每种方法,我只能有OR
条件,而且方法之间只有AND
条件。例如,典型的查询将返回夏季下午的所有时间。所以{:month => [6,7,8,9],:hour => [12,13,14,15,16,17]}
答案 0 :(得分:2)
{:hour => [12, 16], :month => [3]}
.inject(ts){|ts, (k, v)| ts.select{|t| v.include?(t.send(k))}}