我有一个 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")
这工作正常。
我现在希望能够对表格列进行排序。
根据 PostgresDISTINCT ON
不可排序,您必须将其包装在另一个选择语句中,即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")
这可行,但我也希望能够按里程碑订购,但那样行不通。
有人能告诉我如何转换我的 rails 查询,以便它可以按任何列排序吗?
更新
我想我的问题只是如何将 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 查询的范围内。
谢谢