0

これは私のコードです:

def return_rider_values(pol_option, pro_endorsement, prop_coverage, *par)

  rider_values
  par.each do |p|
    rider_values << RiderValue.find_all_by_rider_id(p)
  end

  rider_hash = { }
  rider_values.each do |rv|
    if rv.attributes["name"].downcase == "yes"
      rider_hash.merge!({par[0].to_s => rv.attributes['id'].to_s})
    elsif rv.attributes["position"] == pol_option.to_i && rv.attributes["rider_id"] == par[1]
      rider_hash.merge!({par[1].to_s => rv.attributes["id"].to_s})
    elsif rv.attributes["position"] == prop_coverage.to_i && rv.attributes["rider_id"] == par[2]
      rider_hash.merge!({par[2].to_s => rv.attributes["id"].to_s})
    elsif rv.attributes["position"] == pro_endorsement.to_i && rv.attributes["rider_id"] == par[3]
      rider_hash.merge!({par[3].to_s => rv.attributes["id"].to_s})
    end
  end
  rider_hash
end

出力は次のようになります。

rider_hash  #=> '22' -> 58
                '23' -> 61
                '25' -> 66
                '26' -> 68

私は期待していましたが、後で機能しないため、明らかに必要です:

rider_hash  #=> '22' -> '58'
                '23' -> '61'
                '25' -> '66'
                '26' -> '68'

プログラムの後半でルックアップ関数が ID を int ではなく文字列にしたい理由がわかりません。他の多くの方法で使用されているため、変更することはできません。

私はto_sハッシュキーと値の両方を持っています。to_sRuby 1.9ではエイリアスであることに気付きましたが、ハッシュのドキュメントでinspectさえ、「このハッシュの内容を文字列として返す」ことになっていると書かれています。inspect or to_s

では、なぜキーだけが文字列として返されるのでしょうか?

4

2 に答える 2

0

私はこれを追加することで私が望むものを手に入れることになりました:

rider_hash.each{ |_,v| v.replace "'#{v}'"}

しかし、これはどういうわけか汚い解決策のようです。

于 2013-01-17T21:28:27.813 に答える
0

ハッシュの配列があるので、これを試してください:

def return_rider_values
    par = [1,2,3,6]
    rider_hash = {}
    rider_values = [element1: {:attributes => {:id => 1, :name => 'yes', :position => 1, :rider_id => 1}}, 
                    element2: {:attributes => {:id => 2, :name => 'no', :position => 2, :rider_id => 2}},
                    element3: {:attributes => {:id => 3, :name => 'something', :position => 1, :rider_id => 3}}, 
                    element4: {:attributes => {:id => 4, :name => 'something_else', :position => 2,   :rider_id => 6}}]

    rider_values.each_with_index do |hash, idx|
        rider_values[idx].each_pair do |k, v|
            if v[:attributes][:name].downcase == "yes"
                rider_hash.merge!({par[0].to_s => v[:attributes][:id].to_s})

            elsif v[:attributes][:position] == 2 && v[:attributes][:rider_id] == par[1]
                rider_hash.merge!({par[1].to_s => v[:attributes][:id].to_s})

            elsif v[:attributes][:position] == 3 && v[:attributes][:rider_id] == par[2]
                rider_hash.merge!({par[2].to_s => v[:attributes][:id].to_s})

            elsif v[:attributes][:position] == 4 && v[:attributes][:rider_id] == par[3]
                rider_hash.merge!({par[3].to_s => v[:attributes][:id].to_s})

            end
        end
    end
rider_hash
end

test = return_rider_values

puts test

出力:#=> {"1"=>"1", "2"=>"2"}

于 2013-01-17T20:02:50.230 に答える