Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Ransack,Postgres-对关联表中具有distinct:true的列进行排序_Ruby On Rails_Ruby_Ruby On Rails 4_Rails Postgresql_Ransack - Fatal编程技术网

Ruby on rails Ransack,Postgres-对关联表中具有distinct:true的列进行排序

Ruby on rails Ransack,Postgres-对关联表中具有distinct:true的列进行排序,ruby-on-rails,ruby,ruby-on-rails-4,rails-postgresql,ransack,Ruby On Rails,Ruby,Ruby On Rails 4,Rails Postgresql,Ransack,我有一个使用Ransack gem的应用程序,我正在将它从Mysql转换为Postgres 在排序列来自关联表且distinct选项设置为true的实例中,Postgres会抛出以下错误: PG::InvalidColumnReference: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list Ransack github页面上说,在这种情况下,你只能靠自己 什么是最好的-任何处理这种情况的

我有一个使用Ransack gem的应用程序,我正在将它从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

谢谢

我刚刚遇到了同样的问题,一个对单列排序有效的快速而肮脏的修复方法是添加一个初始值设定项,如下所示。此修补程序将缺少的排序列添加到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

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

q=联系人。搜索 q、 排序=['contact\u type\u name asc'] q、 结果提示:正确。 包括:联系人类型。 连接:联系人类型 或者,如果只想选择几列,可以执行以下操作:

q=联系人。搜索 q、 排序=['contact\u type\u name asc'] q、 结果提示:正确。 选择“联系人。*,联系人类型.姓名”
我已经更新了Ransack的自述文件。

如果我添加此修复程序,当我尝试对结果进行分页时,会得到NoMethodError-未定义的方法“paginate”…如果我将relation.distinct替换为relation.uniq,一切似乎都很好。。。Rails 3.2我真的把它放进去了,它成功了。轨道4.2.6。谢谢你,埃伦!你应该提交一份公关。谢谢。如果除了排序之外,我还使用另一个属性搜索联系人类型呢。我得到以下错误。表的子句条目中缺少。我该如何解决这个问题呢?即使5年后,你仍然可以让人们节省数百小时的工作。谢谢。