Somme ruby valeurs de hachage

Je suis en train de la somme des valeurs d'un rubis de hachage, mais à l'aide soit d'injecter ou de réduire ne renvoie pas la bonne réponse. Il semble que ces méthodes sont en écrasant la valeur actuelle d'être stockée à la place de sommation.

Mon hash ressembler à ceci:

@test = [
  {"total"=>18, "type"=>"buy", "date"=>Thu, 21 Nov 2013, "instrument_code"=>"food"},
  {"total"=>92, "type"=>"buy", "date"=>Thu, 14 Nov 2013, "instrument_code"=>"food"},
  {"total"=>12, "type"=>"buy", "date"=>Wed, 20 Nov 2013, "instrument_code"=>"drink"},
  {"total"=>1, "type"=>"buy", "date"=>Mon, 11 Nov 2013, "instrument_code"=>"food"}
]

Voici mon injecter du code qui échoue:

def additions_per_security
  @test.group_by { |i| i.type }.each do |key, value|
    if key == "buy"
      value.group_by{ |i| i.date }.each do |key, value|
        @sortable_additions[key] = value
      end
      @sorted_additions = @sortable_additions.sort_by { |key,value| key }
      @sorted_additions.shift
      @additions_per_security = Hash[@sorted_additions.map { |key, value| 
       [key, value]
      }]
      @additions_per_security.each do |key, value|
        value.group_by { |i| i.instrument_code }.each do |key, value|
          @additions_security[key] = value.inject(0){ |result, transaction| 
            (result += transaction.total)
          }
        end
      end
    end
  end
  return @additions_security
end

Voici ma réduire code échec:

def additions_per_security
  @@test.group_by { |i| i.type }.each do |key, value|
    if key == "buy"
      value.group_by { |i| i.date }.each do |key, value|
        @sortable_additions[key] = value
      end
      @sorted_additions = @sortable_additions.sort_by { |key,value| key }
      @sorted_additions.shift
      @additions_per_security = Hash[@sorted_additions.map { |key, value| 
        [key, value]
      }]
      @additions_per_security.each do |key, value|
        value.group_by { |i| i.instrument_code }.each do |key, value|
          @additions_security[key] = value.map { |p| p.total }.reduce(0,:+)
        end
      end
    end
  end
  return @additions_security
end

J'ai une table de hachage et je veux faire la somme des totaux pour toutes les touches à l'exception de la première date.

Je suis actuellement la suivante:

{"drink"=>12.0, "food"=>92}

Mon attendus résultat ressemblera à ceci:

{"drink"=>12.0, "food"=>110}

Merci d'avance pour tous les conseils.

votre testhash est foiré ou pas un hash; à réduire votre code que vous utilisez une variable de classe pour testhash. Le montant de la complexité de la méthode, c'est inquiétant, personne ne sera en mesure de vous dire pourquoi reduce échoue. Je pense qu'avec un bon refactoring vous serez en mesure d'obtenir les bugs.
La jordanie, votre premier problème, c'est que @testhash n'est pas une table de hachage. Si vous avez changé l'extérieur {} à [] il serait un tableau de hachages; maintenant, il n'est pas un Rubis objet. Aussi, reduce et inject sont synonymes. Le mieux, pour simplifier, ainsi que résoudre, @testhash, en supprimant les éléments de hachage. La date, en particulier, n'est pas pertinent, mais susceptible d'entraîner des complications.
Battez - vous avez raison, je manque le []. @testhash est une version simplifiée de la table de hachage je m'occupe. Ses juste montrer pertinentes de la valeur de la clé de paris pour cette question. Cary Le champ date est là parce que j'ai besoin de la somme de toutes les valeurs, sauf celles de la première date. J'ai mis à jour la table de hachage
Lire entre les lignes, il semble que votre référence à la "date de la première" doit être interprété comme "ne pas compter les valeurs de la table de hachage avoir la première valeur de date (ici la dernière valeur de hachage dans @testhash)". Vous devez également supprimer 'hash' dans le nom de @testhash. Merci de modifier à préciser.
Oui, c'est correct. Je veux seulement les valeurs de toutes les dates après la première date à laquelle est pourquoi j'ai fait le group_by 'date', triés et éliminés (.maj) la première date

OriginalL'auteur JordanC | 2013-11-21