具有多个模型字段的Order_by mongo查询

时间:2016-02-23 14:25:53

标签: ruby-on-rails ruby mongodb mongoid

我正在构建一个实现过滤和排序功能的索引控制器。

我的第一次审讯涉及订购:

我的模型定义了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个属性的过滤器很好,但这有点超出常规。

旁边问题:控制器是否适合拥有此逻辑?

有没有办法以干净的方式实现这一目标,这意味着尽可能多地利用导轨功能?

1 个答案:

答案 0 :(得分:0)

最简单的事情(像往常一样使用MongoDB)是添加另一个隐藏计算的字段,这样您就不需要在实际查询中尝试任何奇特的东西。假设我们将其称为" status":

field :status, :type => Integer

然后,只要dominationcritical_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)按所需顺序获取内容。