2014-02-08 3 views
0

У меня есть массив id .Найти запись по id для каждого целого числа в массиве

Я пытаюсь выполнить итерацию через эти элементы массива.

@car = car.first 
@driver = @car.drivers.first 

service_ids = ["2", "3", "2", "3"] 

service_ids.each do |service_id| 
    arr = [] 
    results = @driver.services.find_by(id: service_id) 
    arr << results 
end 

arr только возвращает одну запись, скорее всего, последнюю найденную запись.

Как вы это делаете? Есть ли метод рельсов, который делает что-то вроде этого?

Спасибо.

ответ

3

Это происходит потому, что вы инстанцировании массив внутри вашего блока, следующий должен выполнить то, что вы хотите:

@car = car.first 
@driver = @car.drivers.first 

service_ids = ["2", "3", "2", "3"] 

results = service_ids.map { |service_id| @driver.services.find_by(id: service_id) } 

Карта итерацию через вашу коллекцию, и собирает результаты блока с каждой итерации массив как возвращаемое значение.

И на самом деле, ActiveRecord достаточно умна, чтобы выполнить WHERE id IN() запрос, так что следующее будет эквивалентно, и более производительным, так как он будет выполнять только один запрос

@car = car.first 
@driver = @car.drivers.first 

service_ids = ["2", "3", "2", "3"] 

results = @driver.services.where(id: service_ids) 
+0

Спасибо за тщательное объяснение , Действительно ценю это! – JamesDullaghan

1

Вы можете использовать where вместо find_by. Вы также можете попробовать использовать find_all_by.

2

Вы также можете просто позвонить find метод:

@car = car.first 
@driver = @car.drivers.first 

service_ids = ["2", "3", "2", "3"] 

arr = @driver.services.find(service_ids) 

find принимает массив идентификаторов и возвращает массив записей.

0

Ваш код не работает, потому что каждый раз, когда вы смотрите на другой service_id ..., вы возвращаете arr как пустой массив.

Если вы переместили эту строку: arr = [] вне цикла, ваш исходный код начнет работать (даже если это не идеальное решение).

Как Джефф отметил, что лучшим решением будет передать весь набор идентификаторов, чтобы найти - что достаточно умен, чтобы найти целый набор, если вы сделаете это :)

arr = @driver.services.find(service_ids) 
Смежные вопросы