2016-08-15 4 views
1

文字列とオブジェクトの配列を比較しようとしています。文字列の値が配列内のそのオブジェクトと一致すると、それを保持します。ここでruby​​ keep_if配列と文字列の比較

は一例です:

sample.keep_if { |keep_ele| [keep_ele]["child_name"] == name } 

、これは次のエラーを返します:

sample = [#<Model::ID:0x007fcb83ace8a0 
    type_id: 6, 
    parent_name: "Old Man", 
    child_name: "Junior">, 
#<Model::ID:0x007fcb83abd0a0 
    type_id: 6, 
    parent_name: "Mary", 
    child_name: "Michelle">, 
#<Model::ID:0x007fcb83abce70 
    type_id: 6, 
    parent_name: "Ole Bob", 
    child_name: "Bobby">] 

name = "Michelle" 

だから私は、次のことを試してみました はTypeError:整数

に文字列のいない暗黙の型変換をしかし私がIRBにいるとき、私はsample[1]["child_name"]を出力します。それは"Michelle"

です

は、それでは私が試した:

sample.keep_if { |keep_ele| keep_ele["child_name"] == name } 

、それだけで空の配列が返さ:[]

keep_ifを実行する方法上の任意のアイデアを?

答えて

4

keep_elekeep_ifブロックはすでに配列のモデルオブジェクト(項目)です。代わりに次の比較を使用する必要があります。

sample.keep_if { |keep_ele| keep_ele["child_name"] == name } 

Array#keep_ifのドキュメントページをご覧ください。以下は同様の例です:

sample = [ 
    { 
    "child_name" => "Mike" 
    }, { 
    "child_name" => "Michelle" 
    }, { 
    "child_name" => "Joe" 
    } 
] 

name = "Michelle" 
puts sample.keep_if { |keep_ele| keep_ele["child_name"] == name } 
# => {"child_name"=>"Michelle"}