2010-01-18 4 views
2

Je cours la méthode suivante et je passe avec succès deux arguments (inventaire, quantité) dans la méthode. Cependant, je n'utilise pas correctement les méthodes .first et .each. Je tente de remplacer .each avec le .select pour sélectionner l'élément de panier avec le ID d'inventaire: 6Ruby Select méthode (pour un tableau) problèmes

remplacement possible .each: (ne fonctionne pas) inventory_to_increment = @items.select{|item| item_id == inventory}

def increment_inventory_quantity(inventory, quantity) 
    inventory_to_increment = @items.each{|item| item.inventory == inventory} 
    unless inventory_to_increment.empty? 
     inventory_to_increment = inventory_to_increment.first 
    else 
     # error handling here 
    end 
    inventory_to_increment.quantity = quantity.to_i 
end 

J'ai utilisé Debugger Ruby, pour déboguer mon code:

inventory_to_increment = @ items.each {| item | item.inventory == inventaire}

p inventory = 6 

moins inventory_to_increment .empty?

CartItem:0x102c4a4c0 @quantity=22, @inventory=#<Inventory id: 1 

CartItem:0x102c49638 @quantity=2, @inventory=#<Inventory id: 8 

CartItem:0x102c48918 @quantity=4, @inventory=#<Inventory id: 50 

CartItem:0x102c47b80 @quantity=2, @inventory=#<Inventory id: 6 

inventory_to_increment.first

CartItem:0x102c4a4c0 @quantity=22, @inventory=#<Inventory id: 1 

inventory_to_increment.quantity = quantity.to_i

= 3 

J'ai essayé plusieurs combinaisons et je besoin de quelques conseils de tableau de base Ruby. Merci d'avance!

SORTIE DE MISE À JOUR DE RÉPONSE

inventory_to_increment = @items.select{|item| item.inventory_id == inventory} 
(rdb:1) list 
[21, 30] in /Users/justin/cart/app/models/cart.rb 
    21 
    22 
    23 def increment_inventory_quantity(inventory, quantity) 
    24 debugger 
    25 
=> 26  inventory_to_increment = @items.select{|item| item.inventory_id == inventory} 
    27 unless inventory_to_increment.empty? 
    28  inventory_to_increment.first 
    29 end 
    30 
(rdb:1) p @items 
[#<CartItem:0x102df1828 @quantity=22, @inventory=#<Inventory id: 1>>, #<CartItem:0x102df09a0 @quantity=2, @inventory=#<Inventory id: 8>>, #<CartItem:0x102ded908 @quantity=21, @inventory=#<Inventory id: 50>>] 
(rdb:1) p inventory 
50 
(rdb:1) p quantity 
"11" 
(rdb:1) p item.inventory.id 
NameError Exception: undefined local variable or method `item' for #<Cart:0x102df18f0> 
(rdb:1) p item.inventory_id 
NameError Exception: undefined local variable or method `item' for #<Cart:0x102df18f0> 
(rdb:1) next 
/Users/justin/.gem/ruby/1.8/gems/actionpack-2.3.5/lib/action_controller/rescue.rb:162 
rescue_action(exception) 
+0

N'oubliez pas 'inventory_to_increment.save!'. –

+0

Essayez de remplacer 'item.inventory_id == inventory' par' item.inventory.inventory_id == inventory' –

Répondre

1

Il semble Inventory est un objet et s'il est probable que votre item.inventory == inventory ne fonctionnera pas comme prévu. Disons que vous avez une classe d'objet.

class Item 
    attr_accessor :inventory_id, :quantity 

    def initialize(inventory_id, quantity) 
    @inventory_id = inventory_id 
    @quantity = quantity 
    end 
end 

puis vous créez deux objets et de les comparer:

>> item1=Item.new(8,2) 
=> #<Item:0xb7b733bc @inventory_id=8, @quantity=2> 
>> item2=Item.new(8,2) 
=> #<Item:0xb7b6b7c0 @inventory_id=8, @quantity=2> 
>> item1==item2 
=> false 

Ceci est parce que vous comparez les IDs d'objet (0xb7b733bc à 0xb7b6b7c0) au lieu du contenu des objets.

>> item1.inventory_id==item2.inventory_id 
=> true 

Il voulez alors vous semble seulement ajouter au quantity au premier élément correspondant à l'ID d'inventaire. Si c'est correct alors vous pouvez essayer quelque chose comme ça

inventory_to_increment=items.select {|item| item.inventory.inventory_id==inventory} 
unless inventory_to_increment.empty? 
    inventory_to_increment.first.quantity+=quantity 
end 
+0

Je ne suis pas sûr que cela fasse une différence que je suis rails, mais j'ai suivi votre conseil et ajouté la sortie ci-dessus. Vous pouvez voir que j'ai changé les éléments à @items et inventory.id à l'inventaire –

+0

J'ai changé pour item.inventory.inventory_id' pour suivre la convention Rails ActiveRecord. –

+0

Merci! quel mal de tête ce problème a été –

1

Vous pouvez utiliser Enumerable # trouver au lieu de ce que vous avez ici, puisque vous essayez de sélectionner un seul élément d'un tableau. Ce serait une approche «trouver et incrémenter».

L'alternative est de simplement utiliser la chaque iterator pour augmenter les stocks correspondants, où si l'hypothèse est il n'y aura que l'un, alors il n'y a pas d'inquiétude au sujet de la duplication:

def increment_inventory_quantity(inventory, quantity) 
    @items.each do |item| 
    if (item.inventory == inventory) 
     item.inventory.quantity += 1 
    end 
    end 
end 

On ne sait pas ce que le la structure interne de vos différents objets est, donc je suppose que vous voulez simplement incrémenter ici.

+0

Cela ne semble pas fonctionner, quand je l'ai implémenté, il teste le premier élément d'un tableau (dans mon item de cas de test 1) puis article 1 DNE item 6 et renvoie false. J'ai choisi select parce que j'ai un tableau d'objets d'inventaire, j'ai besoin de sélectionner un objet spécifique, "Inventory id: 6" plutôt que seulement le premier objet dans le tableau. –

+0

... bien sûr c'est une boucle, euh. –

+0

Je ne cherche pas simplement à incrémenter (comme son nom l'indique). J'essaie de définir l'élément de tableau sélectionné (dans votre cas item.inventory.quantity) égal à la quantité passée en paramètre. Quand je corrige votre code ci-dessus: item.inventory.quantity = quantity.to_i rien ne se passe du tout. que se passe-t-il? –

0

Je pense que quelque chose comme ce que vous avez besoin,

def increment_inventory_quantity(inventory, quantity) 
    @items.each { |item| item.quantity += quantity.to_i if item.inventory == inventory } 
end