2015-05-08 137 views
3

我有Job类:创建对象的数组基于下令​​子类的属性

class Job < ActiveRecord::Base 
    has_many :stops 
end 

Stop类有一个属性,datetime :arrival time

什么是一个简洁的方式来获得数组所有工作,按相关站点的最早到达时间排序?

例如

如果job_1有两个站点,一个到达时间为下午4点,另一个到达时间为下午5点。

而job_2有两个站点,一个到达时间为下午3点,另一个到达时间为下午6点。

我需要的array: [job_2, job_1]

我能够做到这一点,但在一个麻烦的方式,其中涉及循环和临时存储值。

谢谢!

回答

2
Stop.all.order_by(arrival_time: :asc).select(:job).distinct 

它将按到达时间排序,然后选择唯一的作业。 确保停止模型具有belongs_to:作业。

+0

由于就业机会,这是伟大的。我实际上会使用下面的解决方案,因为我可以将这种排序应用于任何任务子集,但是您首先得到培根:) – user3711600

+1

您的解决方案在我的操场中不起作用,我发布我的工作版本以完成回答:'Stop.all.order(arrival_time :: asc).select(:job_id).distinct'。并且不返回像op所要求的一系列作业,而是返回一系列停靠点。无论如何,答案是好的。 –

+0

我得到一个错误ActiveRecord :: StatementInvalid:PG :: UndefinedColumn:错误:列“作业”不存在 –

3

这是一个很好的问题!弗朗西斯科的答案应该是你到哪里去,但如果你更愿意利用子系列的连接,你还有其他的选择。

Job.includes(:stops).order('stops.arrival_time ASC') 

交换includesjoins,如果你要省略那些没有任何停止

相关问题