У меня есть приложение rails:
user has_many :projects
user has_many :tasks, :through => :projects
project has_many :tasks
Каждая задача имеет знаменательную дату.
Чтобы показать таблицу деталей проекта со следующей вехой, я использую:
@projects = current_user.tasks.joins(:project).select("distinct on (projects.id) projects.*, tasks.*").reorder("projects.id, tasks.milestone ASC")
Это отлично работает.
Теперь я хочу иметь возможность сортировать столбцы таблицы.
В соответствии с Postgres DISTINCT ON
не сортируется, вы должны обернуть его в другой оператор select, то есть SELECT * FROM (SELECT DISTINCT ON....) ORDER BY column_3
Я думал, что упорядоченный столбец может быть просто обработан в SQL по мере необходимости, т.е. (для заказа по названию проекта DESC):
@projects = current_user.tasks.joins(:project).select("distinct on (projects.name) projects.*, tasks.*").reorder("projects.name DESC, tasks.milestone ASC")
который работает, но я также хочу иметь возможность заказать по веху, и это не работает.
Может ли кто-нибудь сказать мне, как преобразовать мой запрос на рельсы, чтобы он мог быть заказан любым из столбцов?
ОБНОВЛЕНИЕ
Я полагаю, что мой вопрос заключается в том, как просто обернуть запрос activerecord в окружении SELECT
и ORDER BY
?
Думаю, мне удалось добиться этого, используя:
inner_query = current_user.tasks.select("distinct on (projects.id) projects.*, tasks.*").reorder("projects.id, tasks.milestone ASC").to_sql
@projects = Task.paginate_by_sql("select * from (#{inner_query}) as user_projects order by user_projects.name", :page => params[:page])
Это лучший способ, или кто-то может подумать о лучшем способе? - find/paginate_by_sql кажется обходным путем, и я предпочел бы оставаться в пределах запросов activerecord.
Спасибо