【发布时间】:2021-08-24 17:09:33
【问题描述】:
我正在尝试实现一个非常具体的查询,但似乎无法找到方法。
我正在使用 ransack gem 进行过滤,并且我设置了 (distinct: true),因为我想同时过滤和排序,这给我带来了我正在尝试解决的问题。
我有一个名为 A 的模型,A 有一个名为“状态”的列。 'status' 可以是'approved'、'approved by manager'、'pending' 或'rejected'。
我想保持数据库顺序默认,但想按照自定义顺序返回它
STATUS_ORDER = ['approved_by_leader', 'pending', 'approved', 'rejected']
我使用了这段代码:
def self.order_by_status
ret = "CASE"
STATUS_ORDER.each_with_index do |s, i|
ret << " WHEN state LIKE '#{s}' THEN #{i}"
end
ret << " END ASC"
end
然后,我刚刚定义了范围:
scope :by_status_priority, -> { order(order_by_status) }
这是我在控制器中使用的范围。这会起作用,除非我想将(distinct: true) 保留在洗劫中,以避免在使用查询时出现重复的结果。
我得到的错误是:
"PG::InvalidColumnReference: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list\nLINE 1:
我可以就如何处理这个问题提出一些建议。我需要保留 (distinct: true) 或有另一种避免重复的方法。
稍后我还将使用嵌套排序,这是 (distinct: true) 无法使用的,但可以通过在我的控制器中使用包含和连接来解决此问题,这样就不会有问题了。更多信息在这里:Ransack, Postgres - sort on column from associated table with distinct: true
【问题讨论】:
-
感谢您的建议@engineersmnky。是的,查询很好,如果我的,那只是一个错误。我已经使用 (distinct: false) 进行了尝试,并且范围工作正常。我现在遇到的问题是让它工作(不同:真的)。我想我应该告诉查询“状态”也是不同的值,而不仅仅是“id”(默认)?我建议创建一个新专栏来设置优先级,但我的同事认为我们应该找到更好的方法。
-
@engineersmnky 老实说,您的代码现在超出了我的理解范围(笑)。我确实尝试过,但我得到了这个错误:
syntax error, unexpected local variable or method, expecting '}'\n...tatus).as(:status_order) )order(Arel.sql(order_by_status).as...\n... ^~~~~\n"我试图修复它,但修复我不理解的东西应该不是那么容易!我确实在订购前发现了一个空白区域 -
@engineersmnky 我确实尝试用点修复它(而且,由于 status_order 是一个常量,也尝试设置为(STATUS_ORDER)而不是:status_order)但我无法让它工作,这是我添加点后得到的。 (.):
"no implicit conversion of Symbol into String"。知道出了什么问题吗? -
@engineersmnky 你到底是怎么想到这个的?有用。请您在下面发表评论,以便我可以将其标记为已解决?如果您对我可以在哪里阅读有关该主题的更多信息有任何建议,以充分理解范围表达式,那也很棒。非常感谢!
标签: ruby-on-rails postgresql ransack