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})/次の2つの理由により、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 に答える