Получение нескольких хешей из одного запроса в rails & SQL - PullRequest
1 голос
/ 20 июля 2011

Я хочу сделать что-то вроде -

@apples  = Fruit.find :all, :conditions => ["type = ?", "apple"]
@pears   = Fruit.find :all, :conditions => ["type = ?", "pear"]
@tomatos = Fruit.find :all, :conditions => ["type = ?", "tomato"]

Проблема в том, что это принимает 3 запроса БДЕсть ли способ объединить их, чтобы он только сделал 1 запрос, но получил всю необходимую информацию?

Ответы [ 2 ]

1 голос
/ 20 июля 2011

Как уже говорилось в комментарии , выполнение большого запроса и выборка всех записей, а затем выбор их с помощью Ruby могут быть проблемой.Есть несколько причин, чтобы MySQL (или любая используемая вами база данных) выполняла эту работу:

  1. Если у вас есть 1 миллион записей, Ruby должен создать 1 миллион объектов ActiveRecord.Это очень быстро израсходует память и может сделать ваше приложение непригодным для использования, особенно на производстве.Представьте, что к вашему сайту заходит 100 пользователей, и каждая из ваших динамов (надеюсь, у вас их больше одного) должна загрузить 1 миллион записей и сравнить 1 миллион строк!

  2. Пусть база данных выполнит свою работу,Им нравится их работа, и они действительно хороши в этом.Фактически они оптимизированы для выполнения таких запросов.Если ваша база данных работает медленно, проверьте ваши индексы и при необходимости измените их.

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

1 голос
/ 20 июля 2011

Я думаю, вам может понадобиться получить все фрукты, тип которых может быть «яблочный», «грушевый» или «томатный», а затем в рубиновом итерации создать необходимую коллекцию фруктов.

   @fruits = Fruit.find :all, :conditions => ["type = ? or type =? or type =? , "apple", "pear", "tomata"]

Тогда в ruby ​​вы можете сделать что-то вроде этого (очень просто).

 @apples = @fruits.select{|f| f.type == "apple"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...