2016-08-15 4 views
1

Ich versuche, eine Zeichenfolge mit einem Array von Objekten zu vergleichen. Wenn also ein String-Wert mit dem Objekt innerhalb des Arrays übereinstimmt, wird es beibehalten. HierRuby keep_if Vergleich eines Arrays mit String

ist das Beispiel:

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" 

So habe ich versucht, die folgenden:

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

und diese gibt die folgende Fehlermeldung: Typeerror: keine implizite Konvertierung von String in Integer

Aber wenn ich in IRB bin und ich sample[1]["child_name"] ausspreche, entspricht es "Michelle"

So dann habe ich versucht:

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

und es ist gerade ein leeres Array: []

Irgendeine Idee, wie man die keep_if laufen?

Antwort

4

keep_ele innerhalb des keep_if Blocks ist bereits ein Modellobjekt (Element) aus dem Array. Sie sollten stattdessen den folgenden Vergleich verwenden:

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

Werfen Sie einen Blick in die Dokumentation Seite für Array#keep_if. Hier ist ein ähnliches Beispiel:

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"}