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])

Не уверен, что второй будет работать...

Другие вопросы по тегам