Может ли коллекция, возвращаемая активной записью, быть отфильтрована с помощью встроенных методов? - PullRequest
0 голосов
/ 07 марта 2011

У меня есть такая коллекция:

UserLevels
   id
   blah_id
   blah2_id
   ..
   ..

Теперь я хочу дополнительно подать эту коллекцию со всеми строками, которые имеют

blah2_id = 3

Мне не нужно снова обращаться к базе данных, так как у меня уже есть эта коллекция, и эта коллекция в любом случае будет иметь максимум 5-10 строк.

Какой лучший способ сделать это? Или какие у меня есть варианты.

Ответы [ 2 ]

2 голосов
/ 07 марта 2011

Первый вариант, который приходит на ум, это Array#select (только Ruby 1.9):

@collection = UserLevel.all
@filtered_collection = @collection.select { |l| l.blah2_id == 3 }

Класс Ruby Array довольно мощный и заслуживает изучения: http://www.ruby -doc.org / core / classes / Array.html

В Ruby 1.8 эквивалентный метод - Enumerable#find_all:

@filtered_collection = @collection.find_all { |l| l.blah2_id == 3 }
1 голос
/ 07 марта 2011

ИМХО было бы лучше, если бы вы настроили запрос к базе данных, чтобы получить нужные объекты.Использование Array # select для больших массивов довольно медленно.

Причины - весь объект массива будет загружен в память.Array # select запустит блок для каждого элемента.Чрезвычайно интенсивное использование памяти.Вы можете не осознавать этого на своей машине для разработки, но когда вы выполняете такую ​​операцию над массивом с> 5k записей, вы почувствуете жар.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...