2015-05-08 4 views
3

У меня есть класс Job:Создать массив объектов упорядоченной на основе атрибута дочернего класса

class Job < ActiveRecord::Base 
    has_many :stops 
end 

Stop класса имеет атрибут, datetime :arrival time

Что такое сжатый способ получить массив все рабочие места, заказанные по раннему времени прибытия на связанные остановки?

например.

Если job_1 имеет две остановки, один с временем прибытия 4 вечера и один с временем прибытия 17:00.

И job_2 имеет две остановки, один с временем прибытия 3 часа и один с временем прибытия 6 вечера.

я нужен array: [job_2, job_1]

я смог добиться этого, но в громоздкий способ, который включает в себя цикл и временного хранения значений.

Спасибо!

ответ

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

Это займет все остановки, заказанные по времени прибытия, а затем выберите только уникальные задания. Убедитесь, что у модели Stop есть свойство property_to: job.

+0

Спасибо, это здорово. Я на самом деле использую решение ниже, так как я могу применить сортировку к любому подмножеству заданий, но вы сначала получите бекон :) – user3711600

+1

Ваше решение не работает на моей игровой площадке, я публикую свою рабочую версию, чтобы завершить вашу answer: 'Stop.all.order (arrival_time:: asc) .select (: job_id) .distinct'. И не возвращает массив заданий, как заданный оп, а массив остановок. В любом случае ответ хороший. –

+0

У меня ошибка: ActiveRecord :: StatementInvalid: PG :: UndefinedColumn: ERROR: column "job" не существует –

3

Это хороший вопрос! Ответ Франческо должен вас туда, куда вы едете, но если вы предпочитаете использовать соединения над подсериями, у вас есть и другие варианты.

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

Своп includes с joins, если вы хотите, чтобы пропустить работу, которая не имеет каких-либо останавливающие

Смежные вопросы