我有一个哈希,我正在使用正则表达式来选择我想要的键/值对。这是我写的方法:
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 :(得分: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
答案 1 :(得分:4)
gmalete's回答提供了一个优雅的解决方案,但这里只是解释为什么你的正则表达式不太正确。如果你纠正了正则表达式,我认为你的方法将工作,它就不是惯用的Ruby。
/(#{gender})(#{race})/
与number_of_african_male_senior_managers不匹配有两个原因:
1)比赛在哈希键中的性别之前出现; 2)哈希键中有一个下划线需要在正则表达式中。 e.g。
/(#{race})_(#{gender})/
会起作用,但不需要括号,因此可以简化为
/#{race}_#{gender}/
答案 2 :(得分: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.
不完全是你要求的,但也许会有所帮助。