В качестве альтернативы другим ответам может оказаться полезным метод Ruby Array#select
(его не следует путать с методом Active Record с тем же именем). Он принимает блок, который должен отображать элементы массива в логические значения, и фильтрует массив для тех, которые возвращают true
. Э.Г.
[0,1,2,3].select {|x| x%2 == 0 }
# [0,2]
Таким образом, ваш код может потребовать минимального изменения:
def sync_fit!(numbers, current_user)
contacts = User.where(number: numbers)
numbers.each do |number|
users = contacts.select{|contact| contact.number == number }
if user.present?
# Another operation
end
end
end
Это «на уровне рубина». Однако тот факт, что контакты являются отношением ActiveRecord, может вызвать дополнительные запросы. Поскольку у вас больше нет отношений для запроса, вы можете предотвратить это, убедившись, что контакты полностью загружены как объекты ruby, прежде чем продолжить:
contacts = User.where(number: numbers).to_a
должен сделать трюк.
Обратите внимание, что этот подход, вероятно, наиболее близок к существующему коду, который будет выполнять то, что вы хотите. Однако, в зависимости от того, что является «другой операцией», вы можете или не можете найти один из других ответов более эффективным.