7

У меня есть приложение, которое использует драгоценный камень Ransack, и я конвертирую его из Mysql в Postgres.Ransack, Postgres - сортировать по столбцу из связанной таблицы с отличным: true

В случае, когда столбец сортировки из соответствующей таблицы и отдельной опции устанавливается истина, Postgres выдает эту ошибку:

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

страница GitHub Ransack говорит, что в таком случае, как это, "ты сам по себе."

Что самое лучшее - любое! - стратегия для обработки этого сценария?

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 

Спасибо!

ответ

3

Я столкнулся с той же проблемой, и быстрое и грязное исправление, которое работает для сортировки по одному столбцу, будет добавлять инициализатор следующим образом. Этот патч обезьяны добавляет недостающий столбец сортировки в оператор 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 
+0

Если я добавлю это исправление, я получаю «NoMethodError - неопределенный метод' paginate 'для # ", когда я пытаюсь разбивать на страницы результаты ... – Danny

+0

Если я заменил отношение.distinct с отношением.uniq, все, кажется, отлично работает ... (Rails 3.2) – Danny

+1

Ура! Спасибо. –

4

Существует более простой способ решить эту проблему. Используйте 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, чтобы обновить readme Ransack.

+0

Спасибо. Что, если в дополнение к сортировке по этому вопросу, я также ищу в contact_type, используя другое свойство. Я получаю следующую ошибку. Отсутствует запись FROM-clause для таблицы. Как я могу это решить? – ShivamD

 Смежные вопросы

  • Нет связанных вопросов^_^