Выполнить поиск по массиву хэшей, чтобы избежать поиска в базе данных - PullRequest
0 голосов
/ 10 декабря 2011

Методы поиска очень удобны для извлечения записей, и я часто использую: include для предварительной выборки ссылочных записей, чтобы избежать дорогостоящих обращений в БД.

У меня есть случай, когда я получаю все продажи продавцом.

@sales = Sales.find(:all,
                    :include => [:salesperson, :customer, :batch, :product],
                    :conditions => {:salesperson_id => someone},
                    :order => :customer_id)

Затем я хочу нарезать и нарезать кубики возвращенных записей на основе того, что было возвращено. Например, я хочу создать отчет обо всех продажах, совершенных этим продавцом в конкретном магазине, который, как мы знаем, является подмножеством ранее возвращенных данных.

То, что я хотел бы сделать, это

@storeSales = @sales.find_by_store(store_id)

... и извлекать это подмножество из массива, хранящегося в памяти, как новый массив, а не достигать того же самого, выполняя поиск в базе данных снова. В конце концов, @sales - это просто массив объектов Sales, поэтому не кажется необоснованным, что это должно поддерживаться.

Однако не похоже, что есть удобный способ сделать это, не так ли? Спасибо.

1 Ответ

4 голосов
/ 10 декабря 2011

Если вы используете Rails 3, @sales будет объектом критериев AREL.Вы можете сделать следующее:

@sales = Sales.find(:all,
                    :include => [:salesperson, :customer, :batch, :product],
                    :conditions => {:salesperson_id => someone},
                    :order => :customer_id)**.all**

Теперь @sales - это экземпляр объектов модели Array of Sales.Получить подмножество объектов массива теперь легко, используя метод select:

@my_product_sales = @sales.select { |s| s.product == my_product_criteria }

При использовании метод выбора теперь у вас будет @sales, являющийся полным набором результатов, и @my_product_sales, являющийсяподмножество на основе критериев сбора.

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