【发布时间】:2012-11-07 21:49:48
【问题描述】:
我有一个 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")
这可行,但我也希望能够按里程碑订购,但那样不行。
谁能告诉我如何转换我的 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 查询的范围内。
谢谢
【问题讨论】:
-
我对 Rails 很陌生,但是在进行最终查询之前,您是否尝试过将 @foo.group(:id) 用于项目表?
-
@StanM,通过使用 DISTINCT ON,它消除了对
group()的需要,并消除了输入除milestone之外的所有列名的需要。我考虑过使用first_value,但我不知道如何使用它,我看到了这个帖子stackoverflow.com/a/7630564/1116573
标签: ruby-on-rails-3 activerecord sql-order-by distinct-on