2010-01-18 18 views
2

我正在運行以下方法,並且我成功地將兩個參數(庫存,數量)傳入方法。不過,我錯誤地使用了.first.each方法。我試圖用.select來代替。每次與庫存ID來選擇購物車中物品:6Ruby選擇方法(對於數組)問題

可能的。每次更換:(不起作用)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 

我已經使用Ruby調試器,調試我的代碼:

inventory_to_increment = @ items.each {| item | item.inventory == 庫存}

p inventory = 6 

除非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 

我試過幾個組合,我需要一些基本的Ruby陣列的指導。先謝謝你!

UPDATE輸出答案

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

也不要忘記'inventory_to_increment.save!'。 – 2010-01-18 20:56:03

+0

嘗試將'item.inventory_id == inventory'改爲'item.inventory.inventory_id == inventory' – 2010-01-18 21:10:59

回答

1

看來Inventory是一個對象,如果是的話很可能按預期item.inventory == inventory將無法​​正常工作。假設你有一個Item類。

class Item 
    attr_accessor :inventory_id, :quantity 

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

,然後創建兩個對象並加以比較:

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

這是因爲你將比較對象ID(0xb7b733bc到0xb7b6b7c0),而不是對象的內容。

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

然後,它似乎只想要添加到quantity匹配庫存ID中的第一項。如果這是正確的,那麼你可以嘗試這樣的事情

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

我不確定這是否會有所作爲,但我遵循了您的建議並添加了上述輸出。您可以看到我將項目更改爲@items,inventory.id更改爲庫存 – 2010-01-18 20:16:39

+0

我更改爲'item.inventory.inventory_id'以遵循Rails ActiveRecord約定。 – 2010-01-18 21:09:25

+0

謝謝!這個問題是多麼令人頭疼的問題 – 2010-01-18 22:38:26

1

您可能需要使用可枚舉#發現的,而不是你有什麼在這裏,因爲你要選擇一個陣列中的單個元素。這將是一個「發現和增量」的方法。

另一種方法是簡單地使用每個迭代遞增任何匹配的庫存,其中,如果假設是隻會有一個,那麼有沒有關於重複的關注:

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

目前還不清楚是什麼你的各種物體的內部結構是,所以我假設你只是想在這裏增加。

+0

這似乎並不奏效,當我實現它時,它會測試數組中的第一項(在我的測試用例項目中1)然後是項目1 DNE項目6並返回false。 我選擇了select,因爲我有一個庫存對象數組,我需要選擇一個特定的對象「庫存ID:6」而不僅僅是數組中的第一個對象。 – 2010-01-18 19:24:20

+0

......當然這是一個循環,呃。 – 2010-01-18 19:28:14

+0

我並非試圖簡單地遞增(顧名思義)。我試圖設置選定的數組項(在你的情況item.inventory.quantity)等於作爲參數傳遞的數量。當我更正上面的代碼時:item.inventory.quantity = quantity.to_i什麼也沒有發生。到底是怎麼回事? – 2010-01-18 19:46:29

0

我認爲像的是你需要什麼,

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