2012-05-02 2 views
1

У меня есть хэш, который я использую regex on, чтобы выбрать, какие пары ключ/значение я хочу. Вот метод, который я написал:Ruby regex, выбирая несколько слов одновременно

def extract_gender_race_totals(gender, race) 
    totals = @data.select {|k,v| k.to_s.match(/(#{gender})(#{race})/)} 
    temp = 0 
    totals.each {|key, value| temp += value} 
    temp 
end 

хэш выглядит следующим образом:

@data = { 
:number_of_african_male_senior_managers=>2, 
:number_of_coloured_male_senior_managers=>0, 
:number_of_indian_male_senior_managers=>0, 
:number_of_white_male_senior_managers=>0, 
:number_of_african_female_senior_managers=>0, 
:number_of_coloured_female_senior_managers=>0, 
:number_of_indian_female_senior_managers=>0, 
:number_of_white_female_senior_managers=>0, 
:number_of_african_male_middle_managers=>2, 
:number_of_coloured_male_middle_managers=>0, 
:number_of_indian_male_middle_managers=>0, 
:number_of_white_male_middle_managers=>0, 
:number_of_african_female_middle_managers=>0, 
:number_of_coloured_female_middle_managers=>0, 
:number_of_indian_female_middle_managers=>0, 
:number_of_white_female_middle_managers=>0, 
:number_of_african_male_junior_managers=>0, 
:number_of_coloured_male_junior_managers=>0, 
:number_of_indian_male_junior_managers=>0, 
:number_of_white_male_junior_managers=>0, 
:number_of_african_female_junior_managers=>0, 
:number_of_coloured_female_junior_managers=>0, 
:number_of_indian_female_junior_managers=>0, 
:number_of_white_female_junior_managers=>0 
} 

но он вновь заполняется данными после того, как SQL-запроса.

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

Это возвращает 0 для всех, чего не должно быть.

Так пример будет

%td.total_cell= @ee_demographics_presenter.extract_gender_race_totals("male","african") 

Это вернет 4, есть 4 Африки, мужчины-менеджеры.

+0

Введите здесь пример ввода и желаемого результата. – megas

+0

это немного помогает? – TheLegend

+1

При попытке создать регулярные выражения я предлагаю проверить http://www.rubular.com/. – gmalette

ответ

4

Попробуйте что-нибудь подобное.

def extract_gender_race_totals(gender, race) 
    @data.select{|k, v| k.to_s.match(/#{race}_#{gender}/)}.values.reduce(:+) 
end 

extract_gender_race_totals("male", "african") 
# => 4 
+0

очень круто! Мне это очень нравится! – TheLegend

4

gmalete's ответ дает элегантное решение, но здесь это просто объяснение того, почему ваше регулярное выражение не совсем верно. Если вы исправили регулярное выражение, я думаю, что ваш подход будет работать, он просто не такой идиоматический Ruby.

/(#{gender})(#{race})/ не будет соответствовать number_of_african_male_senior_managers по 2 причинам:

1) гонка идет до пола в хэш-ключа и 2) есть подчеркивание в хэш-ключ, который должен быть в регулярном выражении. например

/(#{race})_(#{gender})/ 

будет работать, но круглые скобки не нужны, так это может быть упрощено до

/#{race}_#{gender}/ 
+0

спасибо за помощь, я могу видеть, откуда вы родом! его первый раз, работая с регулярным выражением, так что его кривая обучения – TheLegend

+0

Нет проблем, вы были очень близки к первому пути! – mikej

1

Вместо того, чтобы иметь специфические методы для запроса части ключей (т.е. «gender_race»), вы могли бы сделать общий метод для запроса любого атрибута в любом порядке:

def extract_totals(*keywords) 
    keywords.inject(@data) { |memo, keyword| memo.select { |k, v| k.to_s =~ /_#{keyword}(?:_|\b)/ } }.values.reduce(:+) 
end 

Использование:

extract_totals("senior") 
extract_totals("male", "african") 
extract_totals("managers") # maybe you'll have _employees later... 
# etc. 

Не совсем то, что вы просили, но, возможно, это поможет.

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