2014-12-17 4 views
1

Чтобы ускорить мой код, который в настоящее время работает, слишком много запросов БД в цикле (bar = find_or_create_by()....), чтобы создать запись соединения с такими вещами, как foo.bar_id = bar.id Я решил, что я бы сохранил все bars в памяти с одним Bar.all Загрузка до цикла. Вопрос в том, как быстро найти во всех этих bars для определенного bar.name? Я попробовал bar.where(name: ...), но это возвращается к БД.ruby ​​activerecord отношение коллекция поиск

ответ

1

Если я правильно понимаю вашу проблему, чтобы ускорить работу, вы можете получить все бары и поместить их в память в хэш, который отображает каждый (bar.name) в массив баров.

, например:

bars_hash = Bar.all.group_by(&:name) 

Затем

bars_hash[name] 

вернет все бары, которые соответствуют имени или nil, если нет. При этом вы избегаете последовательного поиска для каждого Foo.

Но если у вас есть я надеюсь, что ваша память не будет заполняться, если у вас слишком много Bar сек

+0

Спасибо, ваш путь гораздо быстрее, так как основано на ключе. последующие поиски из другого ответа заставляют его замедляться из-за большого количества «баров» – Killerpixler

1

Я думаю, что вам нужно:

bars.select { |bar| bar.name == 'the name I want' } 

Это использует Enumerable «s select API, чтобы выбрать элементы из коллекции, соответствующих запросу.

+0

замечательные, спасибо, я буду принимать, как только это позволяет мне – Killerpixler

Смежные вопросы