Ransack,Postgres – 从关联表中对列进行排序,使用distinct:true

我有一个使用Ransackgem的应用程序,我将它从Mysql转换为Postgres。

在排序列来自关联表并且distinct选项设置为true的实例中,Postgres会抛出此错误:

PG::InvalidColumnReference: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list 

Ransack github页面说,在这种情况下,“你是独立的。”

什么是最好的 – 任何! – 处理这种情况的策略?

 q = Contact.includes(:contact_type).search q.sorts = ['contact_type_name asc'] q.result(distinct: true) PG::InvalidColumnReference: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list 

谢谢!

有一种更简单的方法可以解决这个问题。 使用ActiveRecord连接查询或选择查询以添加所需的列,例如:

 q = Contact.search q.sorts = ['contact_type_name asc'] q.result(distinct: true). includes(:contact_type). joins(:contact_type) 

或者,如果您只想选择几列,则可以执行以下操作:

 q = Contact.search q.sorts = ['contact_type_name asc'] q.result(distinct: true). select('contacts.*, contact_type.name') 

我已经做了拉取请求来更新Ransack的自述文件。

我刚刚遇到了同样的问题,并且一个快速而又脏的修复程序适用于单列排序,它将添加一个初始化程序,如下所示。 这个猴子补丁将缺少的排序列添加到select语句中。

 module Ransack module Adapters module ActiveRecord class Context < ::Ransack::Context def evaluate(search, opts = {}) viz = Visitor.new relation = @object.where(viz.accept(search.base)) if search.sorts.any? _vaccept = viz.accept(search.sorts) table = _vaccept.first.expr.relation.name column = _vaccept.first.expr.name relation = relation.except(:order).reorder(_vaccept).select("#{@default_table.name}.*, #{table}.#{column}") end opts[:distinct] ? relation.distinct : relation end end end end end