2015-12-08 3 views
0

У меня есть модель счетчика, который возвращает следующие записи:Количество строк значений вхождений для отдельного другого значения столбца

name.....flowers.....counter 
vino.....rose.........1 
vino.....lily.........1 
gaya.....rose.........1 
rosi.....lily.........1 
vino.....lily.........1 
rosi.....rose.........1 
rosi.....rose.........1 

Я хочу, чтобы отобразить в таблице как:

name | Rose | Lily | 
--------------------- 
Vino | 1 | 2 | 
--------------------- 
Gaya | 1 | 0 | 
--------------------- 
Rosi | 2 | 1 | 

Я хочу отобразите количество цветов для каждого отдельного имени. Я пробовал следующее и задавался вопросом, как я могу сделать это элегантно?

def counter_results 
    @counter_results= {} 
    Counter.each do |name| 
    rose = Counter.where(flower: 'rose').count 
    lily= Counter.where(flower: 'lily').count 
    @counter_results['name'] = name 
    @counter_results['rose_count'] = rose 
    @counter_results['lily_count'] = lily 
    end 
    return @counter_results 
end 

, который я не получаю хэш-значения.

ответ

2

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

Вы можете использовать запрос:

Counter.group([:name, :flowers]).sum(:counter) 

Чтобы получить результирующий набор, который выглядит как:

{ ["vino", "rose"] => 1, ["vino", "lily"] => 2, ["gaya", "rose"] => 1, ["gaya", "lily"] => 0, ... } 

И вы можете сделать что-то вроде этого, чтобы сгенерировать хеш:

def counter_results 
    @counter_results = {} 
    Counter.group([:name, :flowers]).sum(:counter).each do |k, v| 
    @counter_results[k.join("_")] = v 
    end 
    @counter_results 
end 

В результате хеш будет выглядеть так:

{ 
    "vino_rose" => 1, 
    "vino_lily" => 2, 
    "gaya_rose" => 1, 
    "gaya_lily" => 0, 
    ... 
} 

У кого-то еще может быть лучший способ сделать это, но похоже, что это должно быть очень близко.

+0

Спасибо @dinjas. Возможно ли, что мы получим результаты такого же типа без использования счетчика столбцов? – Vinay

+0

@ Vinay Yea, вы должны иметь возможность делать 'Counter.group ([: name,: flowers]). Count' – dinjas

+0

Большое спасибо @dinjas. Это сработало. Можете ли вы посоветовать, что использование REGEX - хороший способ разделить имя от vino_rose на Vino? – Vinay

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