1

我有一个哈希,我正在使用正则表达式来选择我想要的键/值对。这是我写的方法:

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 位非洲男性经理。

4

3 回答 3

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
于 2012-05-02T15:17:30.447 回答
4

gmalete 的回答给出了一个优雅的解决方案,但这只是解释为什么你的正则表达式不太正确。如果您更正了正则表达式,我认为您的方法起作用,它只是不像惯用的 Ruby。

/(#{gender})(#{race})/与 number_of_african_male_senior_managers 不匹配有两个原因:

1)比赛在哈希键中的性别之前出现,2)哈希键中有一个下划线,需要在正则表达式中。例如

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

会工作,但不需要括号,所以这可以简化为

/#{race}_#{gender}/
于 2012-05-02T15:18:01.067 回答
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.

不完全符合您的要求,但也许会有所帮助。

于 2012-05-02T15:46:08.593 回答