【问题标题】:Order_by mongo query with multiple model fields具有多个模型字段的 Order_by mongo 查询
【发布时间】:2016-02-23 14:25:53
【问题描述】:

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

我的第一次询问与订购有关:

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

field :domination, type: Boolean, default: false
field :critical_alert, type: Boolean, default: false

前端公开了 3 个优先级(从最前面到最不重要): -critical_alert(过滤将此标志设置为true的项目) - 支配(过滤将此标志设置为真的项目) - 正常(没有将这两个字段设置为 true 的元素)

假设有一个order_by 功能公开,我们希望按优先级进行过滤。

在这种情况下,order_by:asc 将导致按如下方式订购项目: critical_alert 然后是 domination 然后 normal 优先项目。

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

## 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 功能?

【问题讨论】:

    标签: ruby-on-rails ruby mongodb mongoid


    【解决方案1】:

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

    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) 来按所需的顺序得到东西。

    【讨论】:

    • 根据这篇文章 (stackoverflow.com/questions/12164876/…),这是不可能的。有什么想法吗? .我试过了,但没有成功。
    • field :status 表示它是文档中的真实字段。在数据库中拥有多个事物副本是 MongoDB 的标准过程。
    猜你喜欢
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    相关资源
    最近更新 更多