Rails ActiveRecord: найти из ActiveRecord результат за O(1) раз
Простой вопрос здесь. Скажем, у меня есть активные результаты записи, как это:
@users = User.all
Позже я хочу получить данные о пользователе с определенным идентификатором. Я мог легко сделать User.find('c5ab1bfc-90ac-4b59-b5d3-fd8940aab7b1')
но это сделает еще один запрос к базе данных. Я знаю, что пользователь находится в списке @users, поэтому есть ли способ найти пользователя из @users с определенным идентификатором, не делая еще один запрос к БД и не зацикливаясь на объекте @users?
3 ответа
Да, вы можете использовать #detect, который выберет первое совпадение в отношении без запуска другого запроса:
@user = @users.detect{ |u| u.id == 'c5ab1bfc-90ac-4b59-b5d3-fd8940aab7b1' }
Но если честно, если вы просто запускаете простой запрос #find для пользователя (user.find params[:id]), это не убьет ваше приложение, если я не ошибаюсь.
Обновлено:
Спасибо d34n5 за исправление, #select будет перебирать всю коллекцию, тогда как #detect (aliased #find) остановится и вернет первое вхождение.
Может быть, вы можете построить свой результат в Ruby Hash, используя идентификатор в качестве ключа.
У вас будет O(n) один раз, когда вы будете строить результат, но любой другой доступ к конкретной строке (например, @users['c5ab1bfc-90ac-4b59-b5d3-fd8940aab7b1']) будет O(1).
Я не думаю, что вы имеете в виду что-то вроде?
@user = User.find(params[:id])
или же
@user = @users.find(params[:id])
Не уверен, что второй будет работать...