Ruby on rails 具有多个模型字段的mongo查询订单

Ruby on rails 具有多个模型字段的mongo查询订单,ruby-on-rails,ruby,mongodb,mongoid,Ruby On Rails,Ruby,Mongodb,Mongoid,我正在构建一个实现过滤和排序功能的索引控制器 我的第一个问题涉及订购: 我的模型定义了两个布尔字段,我们可以将其称为优先级: field :domination, type: Boolean, default: false field :critical_alert, type: Boolean, default: false 前端公开了3个优先级(从最前端到最不重要): -严重警告(筛选此标志设置为true的项目) -支配(筛选此标志设置为true的项目) -normal(这两个字段均未设置

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

我的第一个问题涉及订购:

我的模型定义了两个布尔字段,我们可以将其称为优先级:

field :domination, type: Boolean, default: false
field :critical_alert, type: Boolean, default: false
前端公开了3个优先级(从最前端到最不重要): -严重警告(筛选此标志设置为true的项目) -支配(筛选此标志设置为true的项目) -normal(这两个字段均未设置为true的元素)

假设有一个order\u by特性公开,我们希望按优先级进行过滤

在这种情况下,
order\u by:asc
将导致按如下方式订购物品: 紧急警报然后控制然后正常优先项目

我的第一个想法是将结果划分为每个组,然后按照正确的顺序合并:

## 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]
我的问题是,我还需要对结果进行分页。似乎page方法仅在activeRecord实例上可用。我有点被踩了。构建直接应用于1个属性的过滤器是可以的,但这有点超出标准

次要问题:控制器是否适合放置此逻辑

有没有一种方法可以以干净的方式实现这一点,这意味着尽可能多地利用rails功能?

最简单的方法(与MongoDB一样)是添加另一个隐藏计算的字段,这样您就不需要在实际查询中尝试任何花哨的东西。假设我们称之为“状态”:

然后,无论何时
控制
严重警报
发生更改(或创建新的
事件
),都可以重新计算
状态

def recompute_status
    if(critical_alert)
        self.status = 0
    elsif(domination)
        self.status = 1
    else
        self.status = 2
    end
end
一旦你有了它,你就可以
.asc(:status)
.desc(:status)
以获得所需的顺序。

最简单的事情就是(像MongoDB一样)添加另一个隐藏计算的字段,这样你就不需要在实际的查询中尝试任何花哨的东西。假设我们称之为“状态”:

然后,无论何时
控制
严重警报
发生更改(或创建新的
事件
),都可以重新计算
状态

def recompute_status
    if(critical_alert)
        self.status = 0
    elsif(domination)
        self.status = 1
    else
        self.status = 2
    end
end

一旦你有了它,你就可以
.asc(:status)
.desc(:status)
按所需的顺序进行操作。

根据这篇文章(),这是不可能的。有什么想法吗。我尝试了它,但没有多大成功。
field:status
表示它是文档中的真实字段。在数据库中有多个副本是MongoDB的标准过程。有什么想法吗。我尝试了它,但没有多大成功。
field:status
表示它是文档中的真实字段。在数据库中拥有多个副本是MongoDB的标准过程。