2015-05-08 93 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,如果你要省略那些沒有任何停止

相關問題