2015-03-18 5 views
0

У меня есть модель автомобиля и модель драйвераДобавление столбца в результате отношения в ActiveRecord

Car has_many :drivers 

У меня есть запрос для недавно управляемых автомобилей водителей с определенным рейтингом

Car.recently_driven.joins(:drivers).merge(Driver.with_good_rating) 

Это будет дайте мне список машин.

Как получить доступ к драйверам, для которых эти автомобили были выбраны в запросе? или перефразировать, как я могу прикрепить driver_id к машинным строкам, которые приводятся в запросе?

для дальнейшего уточнения своих намерений: Я хочу, чтобы результат запроса выше будут столбцами автомобиля, но с другой колонкой с driver_id. Так что я могу получить доступ к driver_id без запроса снова

ответ

1
Car.recently_driven.joins(:drivers).includes(:drivers).merge(Driver.with_good_rating) # will give you what you already have, but with reduced queryes 

Тогда вы могли бы сопоставить результат, используя map

Car.recently_driven.joins(:drivers).merge(Driver.with_good_rating).map do |car| 
    [car, car.driver_ids] 
end 

вернется:

[ 
    [car_object, driver_ids], 
    ... 
    [car_object, driver_ids], 
] 

Вы можете попробовать DB решение, не конечно, если это будет работать для вашего примера.

cars = Car.recently_driven.joins(:drivers).includes(:drivers).merge(Driver.with_good_rating) 

затем

first_car = cars.first 
driver_ids_f = first_car.driver_ids # it will not make DB query, it is loaded bot not shown 
+0

Должен ли я пройти через все это? Или это потому, что он был загружен, это не больно? –

+0

Это по-прежнему болит, потому что таким образом вы делаете запрос к БД, а затем разбираете свои данные. Это медленнее, чем запрос к БД, который будет делать то же самое. – Nermin

0

Получить все драйвера для которых эти автомобили были выбраны

Сначала получить результат в локальной переменной, как вы делаете

cars = Car.recently_driven.joins(:drivers).merge(Driver.with_good_rating) 

Тогда Получить все драйверы, используя

drivers = Driver.find_by(car_id: cars.pluck(:id)) 
Смежные вопросы