2013-04-04 4 views
0

Я извлечение некоторые данные из базы данных, как показано ниже в моем файле рубина:Нарезка массив в Рубине

@main1= $connection.execute("SELECT * FROM builds 
       WHERE platform_type LIKE 'TOTAL';") 

@main2= $connection.execute("SELECT * FROM builds 
       WHERE platform_type NOT LIKE 'TOTAL';") 

После этого я совершаю хеширования и куча других вещей на этих результатах. Чтобы быть ясным, это не возвращает массив как таковой, но возвращает некоторый объект типа mysql2. Так что я просто сопоставить его с 2-х массивов безопасна:

@arr1 = Array.new 
@arr1 = @main1.map 

@arr2 = Array.new 
@arr2 = @main2.map 

Есть ли способ, чтобы избежать выполнения 2 различных запросов и получить все результаты в 2-х разных массивов, выполняя только один запрос. Я в основном хочу разбить результаты на 2 массива, первый из которых имеет platform_type = TOTAL и все остальное в другом.

+2

Вы говорите, что используете рельсы, но вы не используете ORM? Любая конкретная причина? Также ваши вызовы '@arr = Array.new' излишни. –

ответ

2

Кроме того, не вдаваясь в, почему вы делаете то, что вы делаете, я хотел бы использовать Enumerable#partition как таковой:

rows = $connection.execute('SELECT * FROM builds') 
like_total, not_like_total = rows.partition { |row| 
    row['platform_type'] =~ /TOTAL/ 
} 

Обратите внимание, что, IIRC, SQL LIKE 'TOTAL' не то же самое как Ruby's "string" =~ /TOTAL/ (что больше похоже на LIKE '%TOTAL%' в SQL-am, не уверен, что вам нужно).

1

Чтобы ответить на ваш вопрос, не вдаваясь в то, почему вы делаете это так:

Верните их все в одном запросе, с дополнительными критериями, то вы можете сгруппировать их, как вы с group_by:

all_results = $connection.execute("SELECT *, platform_type LIKE 'TOTAL' as is_like_total FROM builds").

Это даст каждому из ваших результатов столбец 'is_like_total', который вы можете включить group_by.

http://ruby-doc.org/core-2.0/Enumerable.html#method-i-group_by

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