From d070d1fda180cd44252717e783a70645e4221e50 Mon Sep 17 00:00:00 2001 From: Tony Schneider Date: Fri, 20 May 2011 20:50:09 -0400 Subject: [PATCH] Add support for $set when updating a document in a nested collection --- lib/mongomatic/base.rb | 9 +++++---- test/test_modifiers.rb | 8 ++++++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/lib/mongomatic/base.rb b/lib/mongomatic/base.rb index 7b0d705..00f4c02 100644 --- a/lib/mongomatic/base.rb +++ b/lib/mongomatic/base.rb @@ -305,10 +305,11 @@ def hash_for_field(field, break_if_dne=false) return [parts[0], curr_hash] if parts.size == 1 field = parts.pop # last one is the field parts.each_with_index do |part, i| - return [part, curr_hash] if break_if_dne && !curr_hash.has_key?(part) - curr_hash[part] ||= {} - return [field, curr_hash[part]] if parts.size == i+1 - curr_hash = curr_hash[part] + part_accessor = curr_hash.kind_of?(Array) ? part.to_i : part + return [part, curr_hash] if break_if_dne && !curr_hash.has_key?(part_accessor) + curr_hash[part_accessor] ||= {} + return [field, curr_hash[part_accessor]] if parts.size == i+1 + curr_hash = curr_hash[part_accessor] end end diff --git a/test/test_modifiers.rb b/test/test_modifiers.rb index d546650..cd095b9 100644 --- a/test/test_modifiers.rb +++ b/test/test_modifiers.rb @@ -153,6 +153,14 @@ def test_set_in_embedded_hash p1 = Person.find_one(p1["_id"]) assert_equal "Ben", p1["l1"]["l2"]["l3"]["l4"]["name"] end + + def test_set_for_embedded_hash_of_nested_document_collection + p1 = Person.new(:name => "Tony") + p1.push('friends', Person.new(:name => "Jordan").doc) + assert p1.insert! + p1.set!("friends.0.isAwesome", "Absolutely!") + assert_equal "Absolutely!", p1["friends"][0]["isAwesome"] + end def test_unset p1 = Person.new(:name => "Jordan")