gpt4 book ai didi

ruby-on-rails-3 - 使用Rails将不同的顺序应用于postgres“DISTINCT ON”

转载 作者:行者123 更新时间:2023-12-03 14:20:48 27 4
gpt4 key购买 nike

我有一个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查询包装在周围的 SELECTORDER 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查询的范围内。

谢谢

最佳答案

您正在尝试获取一组项目,但是从current_user.tasks开始。

为什么不从current_user.projects开始,它保证了不同的项目?

@projects = current_user.projects.includes(:tasks).order("projects.name, tasks.milestone")


替代答案

@projects = current_user.projects.joins(:tasks).select('projects.*, min(tasks.milestone) as next_milestone').order('projects.name').group('projects.id')
@projects.each{|p| puts "#{p.name} #{p.next_milestone}"}


这将为您每个项目提供一行,并具有计算的最小task.milestone值,可通过next_milestone在项目行结果上进行访问。没有额外的任务记录,只有下一个里程碑日期。

关于ruby-on-rails-3 - 使用Rails将不同的顺序应用于postgres“DISTINCT ON”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13278856/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com