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的标准过程。