【问题标题】:Ransack, Postgres - sort on column from associated table with distinct: trueRansack,Postgres - 对关联表中的列进行排序,具有不同:true
【发布时间】:2013-11-03 01:38:16
【问题描述】:

我有一个使用 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

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 rails-postgresql ransack


    【解决方案1】:

    有一种更简单的方法可以解决这个问题。使用 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')
    

    我已经完成了pull request 来更新 Ransack 的自述文件。

    【讨论】:

    • 谢谢。如果除了对此进行排序之外,我还在使用不同的属性搜索contact_type。我收到以下错误。缺少表的 FROM 子句条目。我将如何解决这个问题?
    • 即使 5 年后,您仍然可以让人们节省数百小时的工作时间。谢谢。
    【解决方案2】:

    我刚刚遇到了同样的问题,一个适用于单列排序的快速而肮脏的修复方法是添加一个初始化程序,如下所示。这个猴子补丁将缺少的排序列添加到 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
    

    【讨论】:

    • 如果我添加此修复程序,当我尝试对结果进行分页时,我会收到“NoMethodError - undefined method `paginate' for #<:nodes::distinct:0xa3a0ebc>”...跨度>
    • 如果我用relation.uniq替换relation.distinct,一切似乎都正常......(Rails 3.2)
    • 我真的把它放进去了,它起作用了。导轨 4.2.6。谢谢艾伦!您应该提交 PR。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多