Ruby on Rails/will_paginate: сортировка по пользовательским столбцам

У меня есть довольно сложный SQL-запрос, результаты которого должны быть разбиты на страницы и отображаться пользователю. Я не хочу вдаваться здесь в подробности, но проще говоря, я просто выбираю все столбцы модели и дополнительный столбец, который используется только для целей сортировки.

Note.select( ['notes.*', "<rather complicated clause> AS 'x'"] ).joins(...)...

После некоторых .join()'s и .group() я, наконец, вызываю .order() и .paginate в отношении. Если я заказываю по любому из естественных столбцов модели, все работает нормально, но если я заказываю по "искусственному" столбцу x, то rails дает мне ошибку:

no such column: x

Похоже, это происходит из-за того, что will_paginate выполняет оператор COUNT(*) перед получением фактических данных, просто чтобы получить объемы данных, которые он должен обработать. Этот оператор COUNT(*) (конечно) сгенерирован из исходного оператора, который включает оператор ORDER BY x. Теперь проблема в том, что will_paginate сохраняет ORDER BY в операторе, но просто заменяет определения столбцов на COUNT(*) и, таким образом, не может найти столбец x.

Использование Rails 3 и will_paginate 3.0.pre2.

Есть ли способ обойти это?

спасибо за любую помощь


person DeX3    schedule 02.09.2011    source источник


Ответы (1)


Вы можете отключить начальный запрос подсчета, передав значение вручную:

total_entries = Note.select(...).joins(...).count
Note.select( ... ).joins(...).group().paginate(:total_entries => total_entries)

Вышеприведенный пример не является буквальным примером кода, и вам может потребоваться настроить запрос подсчета, чтобы получить правильные результаты для вашего соединения. Это должно позволить вам сделать прямой сложный запрос на разбиение на страницы.

person Winfield    schedule 02.09.2011