我正在构建一个实现过滤和排序功能的索引控制器。
我的第一次审讯涉及订购:
我的模型定义了2个布尔字段,我们可以将其称为优先级:
field :domination, type: Boolean, default: false
field :critical_alert, type: Boolean, default: false
前端暴露3个优先级(最前面到最不重要): - critical_alert(将此标志设置为true的过滤项) - 统治(过滤将此标志设置为true的项目) - normal(没有将这两个字段都设置为true的元素)
想象一下,有一个order_by
功能已曝光,我们希望按优先级进行过滤。
在这种情况下,order_by:asc
会导致订购商品:
critical_alert 然后支配,然后正常优先项。
我的第一个想法是将结果划分为每个组,然后按照正确的顺序合并:
## Event has a filterable concern that implements the filter method
partition = {}
partition[:critical] = Event.filter(filtering_params(params)).select {|e| e.critical_alert}
partition[:domination] = Event.filter(filtering_params(params)).select {|e| e.domination}
partition[:normal] = Event.filter(filtering_params(params)).select {|e| !e.domination and !e.critical_alert}
pageable = partition[:critical] + partition[:domination] + partition[:normal]
我的问题是我还需要对结果进行分页。似乎页面方法仅在activeRecord实例上可用。我有点st脚。构建直接应用于1个属性的过滤器很好,但这有点超出常规。
旁边问题:控制器是否适合拥有此逻辑?
有没有办法以干净的方式实现这一目标,这意味着尽可能多地利用导轨功能?
答案 0 :(得分:0)
最简单的事情(像往常一样使用MongoDB)是添加另一个隐藏计算的字段,这样您就不需要在实际查询中尝试任何奇特的东西。假设我们将其称为" status":
field :status, :type => Integer
然后,只要domination
或critical_alert
发生变化(或创建新Event
时),就可以重新计算status
:
def recompute_status
if(critical_alert)
self.status = 0
elsif(domination)
self.status = 1
else
self.status = 2
end
end
完成后,您可以.asc(:status)
或.desc(:status)
按所需顺序获取内容。